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

首頁 > 系統(tǒng) > Android > 正文

RxJava和Retrofit2的統(tǒng)一處理單個請求示例詳解

2019-10-21 21:36:15
字體:
供稿:網(wǎng)友

前言

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

什么是Retrofit2

官網(wǎng)是這么介紹的:

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

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

發(fā)現(xiàn)問題

最近在幫兄弟公司做一個資訊類的項(xiàng)目,使用了RxJava和Retrofit2這對黃金組合,在編寫代碼的過程中發(fā)現(xiàn)有很多很多的網(wǎng)絡(luò)請求都需要做.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 { /**  * 統(tǒng)一處理單個請求  */ 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());      }     }    }); } /**  * 統(tǒng)一處理單個請求沒有 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());      }     }    }); }}

回調(diào)就是普通的回調(diào)

public interface RxNetCallBack<T> { /**  * 數(shù)據(jù)請求成功  *  * @param data 請求到的數(shù)據(jù)  */ void onSuccess(T data); /**  * 數(shù)據(jù)請求失敗  */ 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 = "網(wǎng)絡(luò)錯誤";     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 "證書驗(yàn)證失敗";  } 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);   }  });  //設(shè)定日志級別  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) {    // 處理數(shù)據(jù)   }   @Override   public void onFailure(String msg) {    //出現(xiàn)了錯誤    showToast(msg);       }  });

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

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網(wǎng)的支持。


注:相關(guān)教程知識閱讀請移步到Android開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 嵊州市| 汾阳市| 云林县| 麻栗坡县| 琼海市| 贵阳市| 齐齐哈尔市| 福建省| 和田县| 和顺县| 铅山县| 定日县| 连平县| 舞阳县| 浮山县| 定兴县| 东乡族自治县| 同德县| 富裕县| 绥德县| 胶南市| 枣阳市| 华池县| 壶关县| 舞钢市| 三明市| 四平市| 开平市| 南乐县| 武胜县| 江口县| 赞皇县| 林西县| 博客| 玉溪市| 湖南省| 湄潭县| 四川省| 卓资县| 新营市| 班戈县|