封裝RxJava+Retrofit+OkHttp系列——(二)自動切換執行緒
封裝RxJava+Retrofit+OkHttp系列——(一)自動處理網路請求出錯
完整專案Github地址:戳這裡!!!
前言
使用上一篇說的方法封裝完成後,我們的網路請求程式碼應該是這樣的:
HttpManager.getInstance() .getRetrofitService(ApiServer.class) .getLogin("") .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new .....);
存在的問題
還是不夠簡潔。每次呼叫真正的網路請求方法getLogin()之後,都要去切換一下執行緒,如果能省略掉著兩行就好了。
解決辦法
接著改些HttpManager類,讓他能實現自動的執行緒轉換
關鍵方法:
/** * 執行緒轉換 * * @param <T> T * @return ObservableTransformer */ private static <T> ObservableTransformer<T, T> apiIoToMain() { return upstream -> upstream .subscribeOn(Schedulers.io()) .unsubscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); }
ObservableTransformer是rxjava提供的轉換器,不清楚怎麼用沒關係,知道這樣寫就好了,接下來寫個方法來呼叫apiIoToMain()實現執行緒轉換
public static <T> Observable<T> composeRequest(Observable<T> observable) { return observable.compose(apiIoToMain()); }
呼叫執行緒轉換的方法
/** * 自動執行緒轉換,返回observer交給呼叫者去處理 * * @param map 登入引數 * @return Observable物件 */ @Override public Observable<BaseResponse<LoginBean>> getLogin(Map<String, Object> map) { return HttpManager.composeRequest(HttpManager.create(LoginContract.Model.class).nameLogin(map)); }
最終的呼叫
在Activity或者presenter中呼叫:
new LoginModel().getLogin(treeMap).subscribe(new ...);
簡簡單單一句話,然後實現預設的onSuccess()回撥方法,就能輕輕鬆鬆的訪問網路請求了,是不是很爽呢?
完整專案Github地址:戳這裡!!!