前面我们<<RxJava2+Retrofit2实现网络请求封装>>已经学会了去封装简单网络请求框架,但是在网络请求的生命周期部分处理的太过粗糙了,今天我们将引入Rxlifecycle来实现全自动化的管理,也使代码更加的简洁可控.
引入依赖
关于RxJava2和Retrofit2的依赖引入请参考前面的文章,我们直接从Rxlifecycle
说起.
compile 'com.trello.rxlifecycle2:rxlifecycle:2.0.1'
compile 'com.trello.rxlifecycle2:rxlifecycle-components:2.0.1'
引入时需要对应Rxjava的版本.现在所需要的包都有了,现在就可以再次折腾了.
新建RxUtil
类,来做Rxjava的使用代码简化
public class RxUtil {
/**
* 无进度Schedulers
*/
public static <T> ObservableTransformer<T, T> applySchedulers() {
return new ObservableTransformer<T, T>() {
@Override public ObservableSource<T> apply(@NonNull Observable<T> upstream) {
return upstream
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
};
}
/**
* 有进度Schedulers
*/
public static <T> ObservableTransformer<T, T> applySchedulers(@NonNull final Dialog dialog) {
return new ObservableTransformer<T, T>() {
@Override public ObservableSource<T> apply(@NonNull Observable<T> upstream) {
return upstream
.delay(1, TimeUnit.SECONDS)
.subscribeOn(Schedulers.io())
.doOnSubscribe(new Consumer<Disposable>() {
@Override
public void accept(@NonNull final Disposable disposable) throws Exception {
dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override public void onCancel(DialogInterface dialog) {
disposable.dispose();
}
});
dialog.show();
}
})
.observeOn(AndroidSchedulers.mainThread())
.doOnTerminate(new Action() {
@Override public void run() throws Exception {
dialog.dismiss();
}
});
}
};
}
}
主要有两个方法,一个是无加载进度的,这个就很简单了,不带Dialog
参数的就只是单纯的指定线程,而带有Dialog
参数的则在前面的基础上实现了doOnSubscribe
和doOnTerminate
这两个方法.doOnSubscribe
主要处理了加载进度的显示及实现了取消请求的功能,doOnTerminate
该方法不论是处理异常还是成功,都会最后执行,就像finally
一样.
为了能获取到bindToLifecycle()
的方法,需要我们去将Activity和Fragment继承RxAppCompatActivity
和RxFragment
,当然我们也可以不去继承,但是需要参照RxAppCompatActivity
的代码去实现接口LifecycleProvider<ActivityEvent>
,Fragment同样.
有了上面的代码,再结合<<RxJava2+Retrofit2实现网络请求封装>>里面封装过的内容,新的网络请求封装就完成了.
食用方法:
@POST("api/account/loginWithToken")
Observable<Result<Account>> loginWithToken();
RetrofitManager.getInstance().create(IAccount.class).loginWithToken()
.compose(RxUtil.<Result<Account>>applySchedulers(loadingDialog))
.compose(this.<Result<Account>>bindToLifecycle())
.subscribe(new ResultObserver<Account>() {
@Override public void handlerResult(Account account) {
ShareData.getInstance().login(mContext, account);
handler.sendEmptyMessageDelayed(FLAG_SKIP_TO_HOME, 2000);
}
});
以上是项目中的一次网络请求,已经简化了很多代码,网络请求的错误和异常,我通过eventBus发给了BaseActivity来处理,当然都是很通用的处理,如果是需要对个别的需要特殊处理请结合自身情况做修改.
同时我更新了网络请求结果的类ResultObserver
和前面文章中的BaseSubscriber
基本差不多,请自行脑补.
同时我也新增了一个类来处理在Service中我们使用网络请求时的请求结果的处理
public abstract class ResultCallBack<T> implements Callback<Result<T>> {
@Override public void onResponse(Call<Result<T>> call, Response<Result<T>> response) {
if (response.body().getCode() == Constants.NET_CODE_SUCCESS) {
handlerResult(true, null, response.body().getData());
} else {
handlerResult(false, new Throwable(response.body().getMsg()), null);
}
}
@Override public void onFailure(Call<Result<T>> call, Throwable t) {
handlerResult(false, t, null);
}
public abstract void handlerResult(boolean success, Throwable throwable, T t);
}
以上就是全部内容,欢迎各位小伙伴点赞,关注.
网友评论