首先我们看一下上一章的rxjava的调用代码如下,可以看到代码很长,如果每个请求都是这么长肯定不行,其次是返回结果没有转换到bean类,下面我们就从这两面来进行封装
HttpCenter.getInstance().service.getGameList(map)
.subscribeOn(Schedulers.io())//指定网络请求在io线程
.observeOn(AndroidSchedulers.mainThread())//指定返回结果处理在主线程,这样我们就可以在onnext中更新ui了
.subscribe(new Observer<ResponseBody>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull ResponseBody responseBody) {
try {
tvResult.setText(responseBody.string());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
});
- 1 第一步把修改返回结果,统一为ResultEntity<T>,然后通过map方法,将ResultEntity<T>转换为T,代码如下
Observable<ResultEntity<List<GameBean>>> getGameList(@FieldMap Map<String, String> map);//在RetrofitService类修改返回结果
//通过map方法,将结果转换为T,因为我们结果比较简单,所以处理并不复杂,实际情况可能比这复杂多,你可以多用几个操作符一步一步对结果进行处理
private <T1, T2> void post(Observer<T1> observer, Observable<ResultEntity<T2>> observable) {
observable.map(new Function<ResultEntity<T2>, T1>() {
@Override
public T1 apply(@NonNull ResultEntity<T2> t2ResultEntity) throws Exception {
return (T1) t2ResultEntity.getInfo();
}
})
.subscribeOn(Schedulers.io())//指定网络请求在io线程
.observeOn(AndroidSchedulers.mainThread())//指定返回结果处理在主线程,这样我们就可以在onnext中更新ui了
.subscribe(observer);
}
- 2 第二步解决调用代码过长问题,通过调用代码我们看到,每次一个Observer都要有4个需要实现的方法,然而我们关注的可能就是onnext和onerror,所以我们要封装一个自己的Observer类,代码如下
public class BaseObserver<T> implements Observer<T> {
ResponseListener listener;
public BaseObserver(ResponseListener listener) {
this.listener = listener;
}
public interface ResponseListener<T> {
void onSuccess(T t);
void onFail(String error);
}
@Override
public void onSubscribe(@NonNull Disposable d) {
//这里以后可以启动loading
}
@Override
public void onNext(@NonNull T t) {
listener.onSuccess(t);
}
@Override
public void onError(@NonNull Throwable e) {
listener.onFail(e.getMessage());
}
@Override
public void onComplete() {
//关闭loading
}
}
- 3 最后我们再来看一下activity中的调用代码,是不是已经很简单了
HttpCenter.getInstance().getGameList(new BaseObserver(new BaseObserver.ResponseListener<List<GameBean>>() {
@Override
public void onSuccess(List<GameBean> beanList) {
tvResult.setText(beanList.get(0).toString());
}
@Override
public void onFail(String error) {
}
}), map);
}
最后说一下,实际项目的情况处理比这要复杂的多,首先是网络加载的时候要有loading提示,其次返回结果复杂要一步步做处理,还有添加header,拦截器或者自己的gson转换库,需要读者自己去琢磨琢磨
网友评论