亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

RxJava和Retrofit2的統一處理單個請求示例詳解

2019-10-21 21:36:15
字體:
來源:轉載
供稿:網友

前言

RxJava和Retrofit2用了一段時間了,寫個小例子,分享出來,有什么不對的地方還請大神在評論區指正。

什么是Retrofit2

官網是這么介紹的:

Retrofit adapts a Java interface to HTTP calls by using annotations on the declared methods to 
define how requests are made。

我翻譯的可能不準確,他的大概意思是說:Retrofit 是一個 java 接口類,以注解的方式用于 HTTP 網絡請求。那下面我們一起來看看是怎么使用的?

發現問題

最近在幫兄弟公司做一個資訊類的項目,使用了RxJava和Retrofit2這對黃金組合,在編寫代碼的過程中發現有很多很多的網絡請求都需要做.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).onErrorReturn()的處理,為避免這樣,需要沉思。

解決問題

import android.util.Log;import com.wei.caiqiwang.data.entity.BaseResponse;import rx.Observable;import rx.Subscriber;import rx.Subscription;import rx.android.schedulers.AndroidSchedulers;import rx.functions.Func1;import rx.schedulers.Schedulers;public class RxNet { /**  * 統一處理單個請求  */ public static <T> Subscription request(Observable<BaseResponse<T>> observable, final RxNetCallBack<T> callBack) {  return observable    .subscribeOn(Schedulers.io())    .observeOn(AndroidSchedulers.mainThread())    .onErrorReturn(new Func1<Throwable, BaseResponse<T>>() {     @Override     public BaseResponse<T> call(Throwable throwable) {      Log.v("LinNetError",throwable.getMessage());      callBack.onFailure(ExceptionHandle.handleException(throwable));      return null;     }    })    .subscribe(new Subscriber<BaseResponse<T>>() {     @Override     public void onCompleted() {     }     @Override     public void onError(Throwable e) {     }     @Override     public void onNext(BaseResponse<T> baseResponse) {      if (baseResponse.getCode().equals("200")) {       callBack.onSuccess(baseResponse.getData());      } else {       callBack.onFailure(baseResponse.getMsg());      }     }    }); } /**  * 統一處理單個請求沒有 msg body  */ public static Subscription requestWithoutBody(Observable<BaseResponse> observable, final RxNetCallBack<String> callBack) {  return observable    .subscribeOn(Schedulers.io())    .observeOn(AndroidSchedulers.mainThread())    .onErrorReturn(new Func1<Throwable, BaseResponse>() {     @Override     public BaseResponse call(Throwable throwable) {      callBack.onFailure(ExceptionHandle.handleException(throwable));      return null;     }    })    .subscribe(new Subscriber<BaseResponse>() {     @Override     public void onCompleted() {     }     @Override     public void onError(Throwable e) {     }     @Override     public void onNext(BaseResponse baseResponse) {      if (baseResponse.getCode().equals("200")) {       callBack.onSuccess(baseResponse.getMsg());      } else {       callBack.onFailure(baseResponse.getMsg());      }     }    }); }}

回調就是普通的回調

public interface RxNetCallBack<T> { /**  * 數據請求成功  *  * @param data 請求到的數據  */ void onSuccess(T data); /**  * 數據請求失敗  */ void onFailure(String msg);}

錯誤異常處理(可能不全):

import android.net.ParseException;import com.google.gson.JsonParseException;import org.apache.http.conn.ConnectTimeoutException;import org.json.JSONException;import java.net.ConnectException;import retrofit2.HttpException;public class ExceptionHandle { private static final int UNAUTHORIZED = 401; private static final int FORBIDDEN = 403; private static final int NOT_FOUND = 404; private static final int REQUEST_TIMEOUT = 408; private static final int INTERNAL_SERVER_ERROR = 500; private static final int BAD_GATEWAY = 502; private static final int SERVICE_UNAVAILABLE = 503; private static final int GATEWAY_TIMEOUT = 504; public static String handleException(Throwable e) {  String errorMsg;  if (e instanceof HttpException) {   HttpException httpException = (HttpException) e;   switch (httpException.code()) {    case UNAUTHORIZED:    case FORBIDDEN:    case NOT_FOUND:    case REQUEST_TIMEOUT:    case GATEWAY_TIMEOUT:    case INTERNAL_SERVER_ERROR:    case BAD_GATEWAY:    case SERVICE_UNAVAILABLE:    default:     errorMsg = "網絡錯誤";     break;   }   return errorMsg + ":" + httpException.code();  } else if (e instanceof JsonParseException || e instanceof JSONException || e instanceof ParseException) {   return "解析錯誤";  } else if (e instanceof ConnectException) {   return "連接失敗";  } else if (e instanceof javax.net.ssl.SSLHandshakeException) {   return "證書驗證失敗";  } else if (e instanceof ConnectTimeoutException) {   return "連接超時";  } else if (e instanceof java.net.SocketTimeoutException) {   return "連接超時";  } else {   return "未知錯誤";  } }}

然后就是ApiManager:

import android.util.Log;import com.wei.demo.data.AppConstants;import java.util.concurrent.TimeUnit;import okhttp3.OkHttpClient;import okhttp3.logging.HttpLoggingInterceptor;import retrofit2.Retrofit;import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;import retrofit2.converter.gson.GsonConverterFactory;public class ApiManager { private Retrofit client; private ApiManager() {  client = new Retrofit.Builder()    .baseUrl(AppConstants.Base_Url_Api_Test)    .client(initClient())    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())    .addConverterFactory(GsonConverterFactory.create())    .build(); } private static volatile DemoApi INSTANCE; public static DemoApi getInstance() {  if (INSTANCE == null) {   synchronized (ApiManager.class) {    if (INSTANCE == null) {     INSTANCE = new ApiManager().getApi();    }   }  }  return INSTANCE; } private DemoApi getApi() {  return client.create(DemoApi.class); } private static OkHttpClient initClient() {  OkHttpClient.Builder builder = new OkHttpClient.Builder();  //聲明日志類  HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {   @Override   public void log(String message) {    Log.v("NetLog", message);   }  });  //設定日志級別  httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);  //延時  builder.addInterceptor(httpLoggingInterceptor)    .connectTimeout(10, TimeUnit.SECONDS)    .readTimeout(10, TimeUnit.SECONDS)    .writeTimeout(10, TimeUnit.SECONDS);  return builder.build(); }}

怎么用?

 RxNet.request(ApiManager.getInstance().getUserMsg(map), new RxNetCallBack<List<MsgBean>>() {   @Override   public void onSuccess(List<MsgBean> data) {    // 處理數據   }   @Override   public void onFailure(String msg) {    //出現了錯誤    showToast(msg);       }  });

Demo https://github.com/FriendLin/NetRequestDemo

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲影视中文字幕| 成人久久一区二区| 亚洲国产另类 国产精品国产免费| 欧美性感美女h网站在线观看免费| 欧美性在线观看| 国产精品男人爽免费视频1| 日韩欧美aaa| 97国产成人精品视频| 91麻豆国产语对白在线观看| 国产精品96久久久久久又黄又硬| 亚洲国产高清高潮精品美女| 亚洲成人黄色在线观看| 国产精品白嫩美女在线观看| 茄子视频成人在线| 久久影院中文字幕| 国产视频丨精品|在线观看| 深夜福利日韩在线看| 久久精品色欧美aⅴ一区二区| 亚洲精品91美女久久久久久久| 日本免费一区二区三区视频观看| 日韩欧美成人网| 中文字幕最新精品| 91精品国产成人www| 国内精品久久久久久影视8| 久久伊人91精品综合网站| 国产精品久久久久久久久久| 亚洲欧洲日产国码av系列天堂| 久久国产精品影视| 欧美福利小视频| 国产精品久久久久久久久久尿| 国产精品嫩草影院久久久| 色妞色视频一区二区三区四区| 欧美亚洲一级片| 国产欧美日韩91| 欧美在线视频播放| 欧美夫妻性生活视频| 亚洲第一区中文99精品| 91av在线免费观看| 国产偷亚洲偷欧美偷精品| 色偷偷av亚洲男人的天堂| 亚洲欧美成人网| 国产丝袜高跟一区| 亚洲精品www久久久久久广东| 欧美电影在线观看高清| 精品呦交小u女在线| 色综合久久精品亚洲国产| 中文欧美日本在线资源| 日本中文字幕不卡免费| 色综合伊人色综合网| 国自产精品手机在线观看视频| 欧美激情第99页| 久久精品亚洲热| 国产一区二区成人| 日韩国产欧美精品在线| 欧美激情视频一区二区三区不卡| 91欧美精品午夜性色福利在线| 成人黄色av播放免费| 久久香蕉国产线看观看av| 国产精品自产拍在线观看中文| 欧美在线一级va免费观看| 欧美日韩在线一区| 91免费视频网站| 欧美国产精品人人做人人爱| 国产美女精品免费电影| 欧美野外wwwxxx| 91欧美激情另类亚洲| 日本国产精品视频| 久久精品国产91精品亚洲| 日韩一区av在线| 国产激情综合五月久久| 亚洲福利在线视频| 欧美丝袜第一区| 91视频国产一区| 国产日韩精品一区二区| 国产z一区二区三区| 欧美日韩成人免费| 91久久精品国产91久久性色| 欧美午夜视频在线观看| 国产精品一区二区三| 国产在线视频欧美| 日韩精品免费在线观看| 97精品视频在线播放| 中文字幕欧美日韩| 欧美中文字幕在线观看| 成人深夜直播免费观看| 日韩中文字幕免费| 欧美日韩国产丝袜另类| 久热精品视频在线观看| 欧美成人一区二区三区电影| 欧美国产日韩二区| 狠狠躁夜夜躁久久躁别揉| 欧美刺激性大交免费视频| 久久久精品2019中文字幕神马| 久久天堂电影网| 亚洲人午夜精品免费| 97超视频免费观看| 2019中文字幕在线| 欧美人与性动交a欧美精品| 精品日本美女福利在线观看| 亚洲一区二区三区四区视频| 国产精品第一第二| 国产亚洲欧美日韩一区二区| 亚洲精品在线观看www| 国外成人在线视频| 日韩中文字幕免费看| 国产日韩在线观看av| 欧美国产欧美亚洲国产日韩mv天天看完整| 日韩成人在线播放| 国产免费一区二区三区在线观看| 97视频在线观看免费高清完整版在线观看| 国产伦精品一区二区三区精品视频| 欧美裸体xxxx极品少妇软件| 日韩电影在线观看永久视频免费网站| 欧美成aaa人片在线观看蜜臀| 欧美成人一区在线| 91高潮精品免费porn| 国产精品网站大全| 国产精品欧美激情在线播放| zzijzzij亚洲日本成熟少妇| 91av国产在线| 日日骚久久av| 成人黄色av播放免费| 日韩亚洲国产中文字幕| 久久久精品国产亚洲| 亚洲人线精品午夜| 国产91精品网站| 精品久久久精品| 国产精品高潮粉嫩av| 亚洲视频精品在线| 国产精品91在线| 中文在线资源观看视频网站免费不卡| 精品亚洲夜色av98在线观看| 亚洲成人黄色在线| 午夜精品一区二区三区在线视频| 亚洲高清在线观看| 亚洲三级av在线| 久久艹在线视频| 成人国产精品一区| 国产精品视频xxxx| 欧美大片在线免费观看| 国模gogo一区二区大胆私拍| 一本一本久久a久久精品综合小说| 日韩hd视频在线观看| 亚洲精品久久久久中文字幕欢迎你| 欧美日韩国产精品一区二区三区四区| 全亚洲最色的网站在线观看| 欧美夫妻性视频| 亚洲免费人成在线视频观看| 亚洲一区二区三区四区视频| 亚洲人精品午夜在线观看| 中文字幕在线国产精品| 欧美做爰性生交视频| 91精品一区二区| 久久久www成人免费精品| 日韩有码片在线观看| 亚洲国产91精品在线观看| 日韩av在线一区| 欧美亚洲日本黄色| 色久欧美在线视频观看| 国产日产欧美a一级在线| 精品久久久久久久久中文字幕| 国产精品久久久久久久久久久不卡| 欧美精品video| 亚洲欧美在线x视频|