retrofit與rxjava使用
阿新 • • 發佈:2019-01-07
retrofit和rxjava(加深)
Android Retrofit + RxJava使用詳解(基礎)rxjava用法subscribeOn訂閱/** * 傳送訊息 * * @param observable Observable<? extends BaseBean> * @param urlOrigin 請求地址 */ public void sendMessage(Observable<? extends BaseBean> observable, final String urlOrigin) { observable.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<BaseBean>() { @Override public void onSubscribe(@NonNull Disposable d) { } @Override public void onNext(@NonNull BaseBean baseBean) { Log.i("http返回:", baseBean.toString() + ""); ReceiveMessageManager.getInstance().dispatchMessage(baseBean, urlOrigin); } @Override public void onError(@NonNull Throwable e) { } @Override public void onComplete() { } }); }
或者像這樣
getUser(userId) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<User>() { @Override public void onNext(User user) { userView.setUser(user); } @Override public void onCompleted() { } @Override public void onError(Throwable error) { // Error handling ... } });
中文文件
https://mcxiaoke.gitbooks.io/rxdocs/content/
RxJava 的適用場景和使用方式
1. 與 Retrofit 的結合
http://gank.io/post/560e15be2dca930e00da1083retrofit 和網路框架之前資料彙總
個人比較推薦Square開源組合,用Retrofit(目前已經是2.0+)+OkHttp基本上已經可以處理任何業務場景了,Square開源庫質量還是值得信賴的。Retrofit的特點我個人認為是簡化了網路請求流程,同時自己內部對OkHtttp客戶端做了封裝,同時2.x把之前1.x版本的部分不恰當職責都轉移給OkHttp了(例如Log,目前用OkHttp的Interceptor來實現),這樣的好處是職責清晰,Retrofit做自己該做的事兒。而且Retrofit提供不同的Json Converter實現(也可以自定義),同時提供RxJava支援(返回Observable物件),配合Jackson(或者Gson)和RxJava,再加上Dagger2,你的效率至少可以提高一倍。參見我之前的回答:OkHttp在安卓中的使用? - 知乎使用者的回答目前我所在的公司的技術棧沒用到Volley和android-async-http,如果要用的話,估計還是要做一下二次封裝的。同時推薦用最新的Android Flux來架構你的Android程式,Facebook提出的架構,文件比較全,資料流總是單向的,飛。用過MVC,MVP,我還是是比較認同Flux的,而且之前公司用的架構模式跟Flux也比較像android 網路請求框架給 Android 開發者的 RxJava 詳解RxAndroid 是 RxJava 的擴充套件, 優雅地處理非同步請求. RxAndroid 配合 Lambda 表示式, 精簡處理回撥, 使程式更具有可讀性. 本文詳細介紹使用方法. 歡迎 Follow 我的 GitHub: https://github.com/SpikeKing彙總 http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0915/3460.html Retrofit 2.0:有史以來最大的改進Retrofit2.0:Android最好用的http庫有史以來最大的更新 android-async-http使用
Post的實現
private AsyncHttpClient asyncHttpClient = new AsyncHttpClient() ;
RequestParams params = new RequestParams();
params.add("version", version);
params.add("platform", Integer.toString(platform));
client.post(url, params, responseHandler);
1)onStart() 方法是開始傳送請求的時候執行的,一般是把progressDialog放在這裡面顯示,提示使用者等待
2)onFailure() 如果請求失敗了,就會執行該方法,其餘方法就都不執行了,用於提示使用者網路出現故障
3)onSuccess() 是請求成功後,伺服器就會返回JSONObject, arg1就是返回的JSONObject, 在裡面解析JSONObject來回去資料,並顯示在UI上
4)onFinish() 當傳送請求成功後,就執行onFinish()
===============================================================okhttp retrofit離線快取Retrofit2.0+okhttp3實現快取retrofit再度學習Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://www.BaseURL.com/") .addConverterFactory(GsonConverterFactory.create())//自動通過Gson轉josn,上面有提到 .addCallAdapterFactory(RxJavaCallAdapterFactory.create())//新增RxJava支援 .build();Retrofit學習(一)整合-簡單get請求這個資料比較好【Android】RxJava + Retrofit完成網路請求RxJava觀察者模式首先要先介紹一下觀察者模式(可能比喻的不夠恰當,意思到了就好);- 觀察者:監視著被觀察者的行為,當被觀察者某個狀態改變的時候會通知觀察者,觀察者會執行對應的操作;
- 被觀察者:被監視的物件,當某個狀態改變的時候會通知觀察者;
- 訂閱(或註冊):將觀察者和被觀察者建立聯絡。
- 觀察者:OnClickListener;
- 被觀察者:Button;
- 訂閱(或註冊):setOnClickListener()。
- 觀察者:Observer;
- 被觀察者:Observable;
- 訂閱(或註冊):subscribe()。
Observable.just("Hello", "World").subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
Log.i(TAG, s);
}
});
可以看到,我們這裡只用了onNext(obj),還有兩個重寫的onError(error)和onCompleted()並沒有用到,這樣導致我們多出了幾行根本用不到的程式碼。於是就想能不能只寫我們使用到的,其他幾個沒用到的就不寫,這樣的程式碼看著才舒服。接下來就是使用本次的主角Action來代替SubscriberAction上部分的程式碼使用Action來代替Subscriber得到的程式碼是這樣的:
Observable.just("Hello","World").
subscribe(new Action1<String>() {
@Override public void call (String s){
Log.i(TAG, s);
}
});
舒服多了有沒有!!
- 什麼是Action
- Schedulers.immediate():直接在當前執行緒執行,相當於不指定執行緒。這是預設的 Scheduler。
- Schedulers.newThread():總是啟用新執行緒,並在新執行緒執行操作。
- Schedulers.io(): I/O 操作(讀寫檔案、讀寫資料庫、網路資訊互動等)所使用的 Scheduler。行為模式和 newThread() 差不多,區別在於 io() 的內部實現是是用一個無數量上限的執行緒池,可以重用空閒的執行緒,因此多數情況下 io() 比 newThread() 更有效率。不要把計算工作放在 io() 中,可以避免建立不必要的執行緒。
- Schedulers.computation():計算所使用的 Scheduler。這個計算指的是 CPU 密集型計算,即不會被 I/O 等操作限制性能的操作,例如圖形的計算。這個 Scheduler 使用的固定的執行緒池,大小為 CPU 核數。不要把 I/O 操作放在 computation() 中,否則 I/O 操作的等待時間會浪費 CPU。
- AndroidSchedulers.mainThread():它指定的操作將在 Android 主執行緒執行。
- 被觀察者
- 訂閱