Android 之路 (4) - 對RxJava2的簡單封裝
前言
上篇對Retrofit進行了封裝,本篇將繼續深入對RxJava2的執行緒轉換、取消訂閱和統一訂閱結果管理相關的封裝。
正文
執行緒轉換
以下程式碼基本上在每個Presenter中都會使用到,每次都要重新寫就比較繁瑣了,而RxJava提供 compose
方法可以進行合併,具體請看 這裡 ,我可沒寫得他好….
.subscribeOn(Schedulers.io())//執行在io執行緒 .observeOn(AndroidSchedulers.mainThread())//回撥在主執行緒
將以下程式碼加入到BaseApi中,方便每次呼叫:
/** * 統一執行緒處理 * * @param <T> 泛型 * @return */ public static <T> FlowableTransformer<T, T> getScheduler() {//compose簡化執行緒 return new FlowableTransformer<T, T>() { @Override public Flowable<T> apply(Flowable<T> observable) { return observable.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } }; }
在LoginPresenter中進行呼叫:
取消訂閱
在Presenter中只進行了了 == Disposable #f44336== 的訂閱,但是對 Disposable 的取消訂閱卻沒有做,如果我們在網路請求沒完成的情況下關閉 Activity 或者 Fragment,就會造成 記憶體洩露
, 所以我們需要在 onDestroy
的時候取消訂閱。
我這裡的實現思路是將 Disposable
放到 BasePresenter 中,對外開放一個 unDisposable
的方法取消訂閱。
BasePresenter
/** * 基類Presenter,做統一的處理 */ public abstract class BasePresenter { /** * 持有訂閱 */ protected Disposable mDisposable; /** * 取消訂閱 */ public void unDisposable() { if (mDisposable != null) { mDisposable.dispose(); } } }
更改繼承和訂閱
將LoginContract.Presenter繼承BasePresenter,然後再 LoginPresenter 中賦值訂閱後的結果
在LoginActivity 中取消訂閱
@Override protected void onDestroy() { super.onDestroy(); mLoginPresenter.unDisposable(); }
至此簡單完成了訂閱和取消訂閱的封裝。
統一訂閱處理
在進行subscribeWith訂閱的時候,我們使用的是ResourceSubscriber這個抽象類,而又必須實現 onNext #f44336
、 onError
、 onComplete
這三個方法,但事實上我們只需要關注結果 onNext
方法,另外的 onError
、 onComplete
==都可以進行統一的處理,不必每次都進行重寫。
建立BaseView
建立一個BaseView,定義兩個介面:
/** * 基類View,對統一的介面進行定義 */ public interface BaseView { /** * 回撥失敗資訊 * * @param message 失敗訊息 */ void onFailure(String message); /** * 完成網路請求,可以在這個方法中關閉彈出等操作 */ void onComplete(); }
建立ApiSubscriber
建立抽象類ApiSubscriber繼承至ResourceSubscriber,在ApiSubscriber中持有BaseView,實現 onError
、 onComplete
這兩個方法。
/** * 統一訂閱管理 * * @param <T> 泛型 */ public abstract class ApiSubscriber<T> extends ResourceSubscriber<T> { private BaseView view; public ApiSubscriber(BaseView view) { this.view = view; } public ApiSubscriber() { } @Override public void onError(Throwable t) { if (null != view) { view.onFailure(t.getMessage()); } } @Override public void onComplete() { if (null != view) { view.onComplete(); } } }
更改訂閱物件
將ResourceSubscriber更換成我們的ApiSubscriber抽象類。
/** * 登陸Presenter */ public class LoginPresenter extends LoginContract.Presenter { private String TAG = "LoginPresenter"; public LoginPresenter(LoginContract.View view) { super(view); } @Override public void login(String userName, String password) { // 取消上次請求 unDisposable(); // 開始請求 mDisposable = ServiceBuild.getUserService() .login(userName, password) .compose(BaseApi.<LoginDto>getScheduler()) .subscribeWith(new ApiSubscriber<LoginDto>() { @Override public void onNext(LoginDto loginDto) { //結果回撥 Log.e(TAG, "onNext: " + loginDto); if (loginDto.getCode() == 200) { view.loginSuccess(loginDto); } else { view.loginFailure(loginDto.getMessage()); } } }); } }
至於執行效果我們就不查看了,肯定是一致的,不信可以下載原始碼進行檢視
結束
總結
本篇完成了對RxJava2的執行緒轉換、取消訂閱和統一訂閱結果管理相關的封裝,我們的程式碼又簡潔了一部分、需要重複操心的部分也減少了一點,這也是一個大大的進步。
至此,我們的RxJava和Retrofit封裝暫停一篇,下篇將先對 Dialog
進行封裝,敬請期待。
ofollow,noindex">原始碼