国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

深入淺出RxJava+Retrofit+OkHttp網絡請求

2019-12-12 01:39:46
字體:
來源:轉載
供稿:網友

淺談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.常用注解

這里介紹一些常用的注解的使用

  1. @Query、@QueryMap:用于Http Get請求傳遞參數
  2. @Field:用于Post方式傳遞參數,需要在請求接口方法上添加@FormUrlEncoded,即以表單的方式傳遞參數
  3. @Body:用于Post,根據轉換方式將實例對象轉化為對應字符串傳遞參數.比如Retrofit添加GsonConverterFactory則是將body轉化為gson字符串進行傳遞
  4. @Path:用于URL上占位符
  5. @Part:配合@Multipart使用,一般用于文件上傳
  6. @Header:添加http header
  7. @Headers:跟@Header作用一樣,只是使用方式不一樣,@Header是作為請求方法的參數傳入,@Headers是以固定方式直接添加到請求方法上

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/";  /*方法-如果需要緩存必須設置這個參數;不需要不用

主站蜘蛛池模板:
五峰|
丹巴县|
九江县|
新昌县|
盖州市|
盐山县|
裕民县|
五指山市|
蕲春县|
辉南县|
邯郸市|
肇庆市|
防城港市|
睢宁县|
额尔古纳市|
新乐市|
抚宁县|
克拉玛依市|
博客|
永平县|
建阳市|
航空|
纳雍县|
科技|
四会市|
峨眉山市|
乌什县|
天全县|
顺平县|
介休市|
武平县|
蓬莱市|
平乐县|
名山县|
剑阁县|
图木舒克市|
新疆|
嘉兴市|
三亚市|
连山|
嘉义市|