(一)RxJava在Android網絡框架中的使用

博客首頁


    在Android中利用RxJava調度器,我們可以很方便讓被訂閱者 or 訂閱者在不同的線程中各守此責,不多廢話基本RxJava在網絡框架中的使用是再常見不過的了(調度器的優點也體現在這裏)。

            網上已經有很多 RxJava+Retrofit 的教程或者Dmeo ,在此就不多說 ,其實利用Http同步請求配合RxJava的線程調度器搭建一個異步網絡框架本就是so easy(此處可以把RxJava的調度器假設爲一個線程池,但實際上遠不光如此)。
            
        一個最基本的網絡請求(Get):
mTestProtocol.text_Get()                            //  (1)    
.compose(this.<String>bindToLifecycle()) // (2)
.observeOn(AndroidSchedulers.mainThread()) // (3)
.subscribe(new Action1<String>() { // (4)
@Override
public void call(String data) { // (5)
tv_reuslt.setText("Get Result:\r\n" + data);
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) { // (6)
tv_reuslt.setText("Get Result:\r\n" + throwable.getMessage());
}
});
        以上是本人用RxJava+OkHttp實現的一個簡單的網絡Get請求測試,稍後我會詳細介紹OkHttp部分結構。
        (1)通過mTestProtocol的text_Get()方法獲取到一個在IO線程工作的被訂閱者
        (2)compose()操作符搭配rxlifecycle框架解決RxJava可能產生的內存泄漏問題,瞭解詳情請點擊這裏
        (3)指定當訂閱被觸發時,訂閱者工作所在的線程:Android主線程
        (4)通過subscribe()方法觸發兩者之間的訂閱關係,Action1是訂閱者的一種簡寫方式等價對應以下代碼中的onNext()和onError()方法  
new Observer<String>() {
@Override
public void onCompleted() {

}

@Override
public void onError(Throwable e) {

}

@Override
public void onNext(String data) {

}
};
        (5)Action1<String> 對應onNext() , 網絡請求成功的回調,data中是服務器返回的Json數據
        (6)Action1<Throwable> 對應onError() , 網絡請求失敗的回調,e中攜帶請求失敗的相關信息
     
        接下來介紹OkHttp部分,也就是(1)中,網絡層是如何通過text_Get()方法返回一個在IO線程工作的被訂閱者:
        對OkHttp的簡單封裝就不多介紹,不瞭解OkHttp使用方法的同學可以在OKHttp官網博客找到相關資料,正如上面所提到的同步請求+RxJava搭建網絡框架層,所以這裏我們使用的是OkHttp的同步請求方式execute(),而不是CallBack異步請求,瞭解RxJava的同學也應當知道RxJava的好處之一就是:爲了避免CallBack回調在複雜業務下產生的回調嵌套以及大量標記造成的代碼閱讀性差、難以維護等問題。
        以下是text_Get()內部的工作代碼:
public Observable<String> text_Get() {
String path = "1";
return createObservable(BASE_URL + path, XgoHttpClient.METHOD_GET, null); // (1)
}
/**
* 創建一個工作在IO線程的被觀察者(被訂閱者)對象
* @param url
* @param method
* @param params
*/
protected Observable<String> createObservable(final String url, final String method, final TreeMap<String, Object> params) {
return Observable.create(new Observable.OnSubscribe<String>() { // (2)
@Override
public void call(Subscriber<? super String> subscriber) {
Request request = XgoHttpClient.getClient().getRequest(url, method, params); // (3)
String json = XgoHttpClient.getClient().execute2String(request); // (4)
setData(subscriber, json); // (5)
}
}).subscribeOn(Schedulers.io());
}
/**
* 爲觀察者(訂閱者)設置返回數據
* */
protected void setData(Subscriber<? super String> subscriber, String json) {
if (TextUtils.isEmpty(json)) { // (6)
subscriber.onError(new Throwable("not data"));
return;
}
subscriber.onNext(json); // (7)
subscriber.onCompleted();
}
        (1)text_Get()方法通過createObservable()方法返回一個被訂閱者對象
        (2)createObservable()方法通過Observable.create()創建並返回被訂閱者對象
        (3)通過相關網絡請求參數生成一個okHttp的Request對象
        (4)發送請求,並獲取服務器響應數據
        (5)調用setData()方法,將服務器請求結果返回訂閱者
        (6)如果響應數據爲空,觸發訂閱者onError()方法
        (7)數據不爲空,觸發訂閱者onNext()方法  

    一個最基本的RxJava+OkHttp所搭建的網絡層就實現了,以下是測試接口的四種請求方式Demo效果圖:



        加入Gson的網絡層搭建已完成,詳情請戳:(十)【續】網絡框架篇(RxJava+OkHttp+Gson)


發佈了22 篇原創文章 · 獲贊 22 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章