前面我們<<RxJava2+Retrofit2實(shí)現(xiàn)網(wǎng)絡(luò)請(qǐng)求封裝>>已經(jīng)學(xué)會(huì)了去封裝簡單網(wǎng)絡(luò)請(qǐng)求框架,但是在網(wǎng)絡(luò)請(qǐng)求的生命周期部分處理的太過粗糙了,今天我們將引入Rxlifecycle來實(shí)現(xiàn)全自動(dòng)化的管理,也使代碼更加的簡潔可控.
引入依賴
關(guān)于RxJava2和Retrofit2的依賴引入請(qǐng)參考前面的文章,我們直接從Rxlifecycle
說起.
compile 'com.trello.rxlifecycle2:rxlifecycle:2.0.1'
compile 'com.trello.rxlifecycle2:rxlifecycle-components:2.0.1'
引入時(shí)需要對(duì)應(yīng)Rxjava的版本.現(xiàn)在所需要的包都有了,現(xiàn)在就可以再次折騰了.
新建RxUtil
類,來做Rxjava的使用代碼簡化
public class RxUtil {
/**
* 無進(jìn)度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());
}
};
}
/**
* 有進(jìn)度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();
}
});
}
};
}
}
主要有兩個(gè)方法,一個(gè)是無加載進(jìn)度的,這個(gè)就很簡單了,不帶Dialog
參數(shù)的就只是單純的指定線程,而帶有Dialog
參數(shù)的則在前面的基礎(chǔ)上實(shí)現(xiàn)了doOnSubscribe
和doOnTerminate
這兩個(gè)方法.doOnSubscribe
主要處理了加載進(jìn)度的顯示及實(shí)現(xiàn)了取消請(qǐng)求的功能,doOnTerminate
該方法不論是處理異常還是成功,都會(huì)最后執(zhí)行,就像finally
一樣.
為了能獲取到bindToLifecycle()
的方法,需要我們?nèi)ctivity和Fragment繼承RxAppCompatActivity
和RxFragment
,當(dāng)然我們也可以不去繼承,但是需要參照RxAppCompatActivity
的代碼去實(shí)現(xiàn)接口LifecycleProvider<ActivityEvent>
,Fragment同樣.
有了上面的代碼,再結(jié)合<<RxJava2+Retrofit2實(shí)現(xiàn)網(wǎng)絡(luò)請(qǐng)求封裝>>里面封裝過的內(nèi)容,新的網(wǎng)絡(luò)請(qǐng)求封裝就完成了.
食用方法:
@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);
}
});
以上是項(xiàng)目中的一次網(wǎng)絡(luò)請(qǐng)求,已經(jīng)簡化了很多代碼,網(wǎng)絡(luò)請(qǐng)求的錯(cuò)誤和異常,我通過eventBus發(fā)給了BaseActivity來處理,當(dāng)然都是很通用的處理,如果是需要對(duì)個(gè)別的需要特殊處理請(qǐng)結(jié)合自身情況做修改.
同時(shí)我更新了網(wǎng)絡(luò)請(qǐng)求結(jié)果的類ResultObserver
和前面文章中的BaseSubscriber
基本差不多,請(qǐng)自行腦補(bǔ).
同時(shí)我也新增了一個(gè)類來處理在Service中我們使用網(wǎng)絡(luò)請(qǐng)求時(shí)的請(qǐng)求結(jié)果的處理
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);
}
以上就是全部內(nèi)容,歡迎各位小伙伴點(diǎn)贊,關(guān)注.