淺談RxJava+Retrofit+OkHttp 封裝使用 之前發出后收到很多朋友的關注,原本只是自己學習后的一些經驗總結,但是有同學運用到實戰當中,這讓我很惶恐,所有后續一直更新了很多次版本,有些地方難免有所變動導致之前的博客有所出入,正好最近受到掘金邀請內測博客,所以決定重新寫一版,按照最后迭代完成的封裝詳細的講述一遍,歡迎大家關注!
注意:由于本章的特殊性,后續文章比較長而且復雜,涉及內容也很多,所以大家準備好茶水,前方高能預警。
簡介:
Retrofit: Retrofit是Square 公司開發的一款正對Android 網絡請求的框架。底層基于OkHttp 實現,OkHttp 已經得到了google 官方的認可。
OkHttp: 也是Square 開源的網絡請求庫
RxJava:RxJava 在 GitHub 主頁上的自我介紹是 "a library for composing asynchronous and event-based programs using observable sequences for the Java VM"(一個在 Java VM 上使用可觀測的序列來組成異步的、基于事件的程序的庫)。這就是 RxJava ,概括得非常精準。總之就是讓異步操作變得非常簡單。
各自的職責:Retrofit 負責請求的數據和請求的結果,使用接口的方式呈現,OkHttp 負責請求的過程,RxJava 負責異步,各種線程之間的切換。
RxJava + Retrofit + okHttp 已成為當前Android 網絡請求最流行的方式。
封裝成果
封裝完以后,具有如下功能:
1.Retrofit+Rxjava+okhttp基本使用方法
2.統一處理請求數據格式
3.統一的ProgressDialog和回調Subscriber處理
4.取消http請求
5.預處理http請求
6.返回數據的統一判斷
7.失敗后的retry封裝處理
8.RxLifecycle管理生命周期,防止泄露
實現效果:

具體使用
封裝后http請求代碼如下
// 完美封裝簡化版 private void simpleDo() { SubjectPost postEntity = new SubjectPost(simpleOnNextListener,this); postEntity.setAll(true); HttpManager manager = HttpManager.getInstance(); manager.doHttpDeal(postEntity); } // 回調一一對應 HttpOnNextListener simpleOnNextListener = new HttpOnNextListener<List<Subject>>() { @Override public void onNext(List<Subject> subjects) { tvMsg.setText("已封裝:/n" + subjects.toString()); } /*用戶主動調用,默認是不需要覆寫該方法*/ @Override public void onError(Throwable e) { super.onError(e); tvMsg.setText("失?。?n" + e.toString()); } };是不是很簡單?你可能說這還簡單,好咱們對比一下正常使用Retrofit的方法
/** * Retrofit加入rxjava實現http請求 */ private void onButton9Click() { //手動創建一個OkHttpClient并設置超時時間 okhttp3.OkHttpClient.Builder builder = new OkHttpClient.Builder(); builder.connectTimeout(5, TimeUnit.SECONDS); Retrofit retrofit = new Retrofit.Builder() .client(builder.build()) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .baseUrl(HttpManager.BASE_URL) .build(); / 加載框 final ProgressDialog pd = new ProgressDialog(this); HttpService apiService = retrofit.create(HttpService.class); Observable<RetrofitEntity> observable = apiService.getAllVedioBy(true); observable.subscribeOn(Schedulers.io()).unsubscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) .subscribe( new Subscriber<RetrofitEntity>() { @Override public void onCompleted() { if (pd != null && pd.isShowing()) { pd.dismiss(); } } @Override public void onError(Throwable e) { if (pd != null && pd.isShowing()) { pd.dismiss(); } } @Override public void onNext(RetrofitEntity retrofitEntity) { tvMsg.setText("無封裝:/n" + retrofitEntity.getData().toString()); } @Override public void onStart() { super.onStart(); pd.show(); } } ); }可能你發現確是代碼有點多,但是更加可怕的是,如果你一個activity或者fragment中多次需要http請求,你需要多次重復的寫回調處理(一個回到就有4個方法呀?。。。》凑沂侨淌懿涣耍?,而且以上處理還沒有做過多的判斷和錯誤校驗就如此復雜!~好了介紹完了,開始咱們的優化之路吧!
項目結構:

Retrofit
咱家今天的主角來了,咱們也深入淺出一下了解下Retrofit使用,前方高能,如果你是深度Retrofit選手請直接跳過本節!??!
1.首先確保在AndroidManifest.xml中請求了網絡權限
<uses-permission android:name="android.permission.INTERNET"/>
2.在app/build.gradle添加引用
/*rx-android-java*/ compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0' compile 'com.trello:rxlifecycle:1.0' compile 'com.trello:rxlifecycle-components:1.0' /*rotrofit*/ compile 'com.squareup.retrofit2:retrofit:2.1.0' compile 'com.squareup.retrofit2:converter-gson:2.0.0' compile 'com.google.code.gson:gson:2.8.0'
3.常用注解
這里介紹一些常用的注解的使用
ReTrofit基本使用:
首先給定一個測試接口文檔,后面的博客中我們都是用這個接口調試
/** * @api videoLink 50音圖視頻鏈接 * @url http://www.izaodao.com/Api/AppFiftyToneGraph/videoLink * @method post * @param once_no bool(選填,ture無鏈接) 一次性獲取下載地址 * @return json array( * ret:1成功,2失敗 * msg:信息 * data:{ * name:視頻名稱 * title:標題 * } )1.初始化retrofit
要向一個api發送我們的網絡請求 ,我們需要使用Retrofit builder類并指定service的base URL(通常情況下就是域名)。
String BASE_URL = " http://www.izaodao.com/Api/" Retrofit retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build();
2.設置接口service
注意到每個endpoint 都指定了一個關于HTTP(GET, POST, 等等。) 方法的注解以及用于分發網絡調用的方法。而且這些方法的參數也可以有特殊的注解。
/** * 接口地址 * Created by WZG on 2016/7/16. */ public interface MyApiEndpointInterface { @POST("AppFiftyToneGraph/videoLink") Call<RetrofitEntity> getAllVedio(@Body boolean once_no) }3.得到call然后同步處理處理回調:
MyApiEndpointInterface apiService = retrofit.create(MyApiEndpointInterface.class); Call<RetrofitEntity> call = apiService.getAllVedio(true); call.enqueue(new Callback<RetrofitEntity>() { @Override public void onResponse(Response<RetrofitEntity> response, Retrofit retrofit) { RetrofitEntity entity = response.body(); Log.i("tag", "onResponse----->" + entity.getMsg()); } @Override public void onFailure(Throwable t) { Log.i("tag", "onFailure----->" + t.toString()); } });這就是簡單的Retrofit使用步驟,接下來我們結合RxJava講述
ReTrofit+Rxjava基本使用
對比之前的Retrofit使用
1.在于我們需要修改service接口返回信息我們需要返回一個Observable對象
@POST("AppFiftyToneGraph/videoLink") Observable<RetrofitEntity> getAllVedioBy(@Body boolean once_no);2.然后初始化Retrofit需要添加對Rxjava的適配,注意一定要retrofit2才有這個功能哦
Retrofit retrofit = new Retrofit.Builder() .client(builder.build()) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .baseUrl(HttpManager.BASE_URL) .build();
3.回調通過RxJava處理
HttpService apiService = retrofit.create(HttpService.class); Observable<RetrofitEntity> observable = apiService.getAllVedioBy(true); observable.subscribeOn(Schedulers.io()).unsubscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) .subscribe( new Subscriber<RetrofitEntity>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(RetrofitEntity retrofitEntity) { tvMsg.setText("無封裝:/n" + retrofitEntity.getData().toString()); } } );簡單的RxJava集合Retrofit的使用就介紹完了,同樣的可以發現使用起來很多重復性的代碼,而且使用也不是那么簡單,所以才有了下面的封裝
ReTrofit+Rxjava進階封裝之路
先來一張流程圖壓壓驚

請求數據封裝
1.參數
首先需要封裝的使我們的數據類,在數據類中需要封裝請求中用到的相關數據的設置,比如請求參數、方法、加載框顯示設置等等
public abstract class BaseApi<T> implements Func1<BaseResultEntity<T>, T> { //rx生命周期管理 private SoftReference<RxAppCompatActivity> rxAppCompatActivity; /*回調*/ private SoftReference<HttpOnNextListener> listener; /*是否能取消加載框*/ private boolean cancel; /*是否顯示加載框*/ private boolean showProgress; /*是否需要緩存處理*/ private boolean cache; /*基礎url*/ private String baseUrl="http://www.izaodao.com/Api/"; /*方法-如果需要緩存必須設置這個參數;不需要不用
主站蜘蛛池模板:
五峰|
丹巴县|
九江县|
新昌县|
盖州市|
盐山县|
裕民县|
五指山市|
蕲春县|
辉南县|
邯郸市|
肇庆市|
防城港市|
睢宁县|
额尔古纳市|
新乐市|
抚宁县|
克拉玛依市|
博客|
永平县|
建阳市|
航空|
纳雍县|
科技|
四会市|
峨眉山市|
乌什县|
天全县|
顺平县|
介休市|
武平县|
蓬莱市|
平乐县|
名山县|
剑阁县|
图木舒克市|
新疆|
嘉兴市|
三亚市|
连山|
嘉义市|