91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

RxJava2和Retrofit2封裝教程(整潔、簡單、實用)

發布時間:2020-10-22 19:30:47 來源:腳本之家 閱讀:155 作者:林祖朋 欄目:移動開發

前言

RxJava2與Retrofit2是老搭檔了,之前寫了一篇《RxJava和Retrofit2的統一處理單個請求》,是用的Rxjava1.0,本次使用Rxjava2.0與Retrofit2進行封裝,一樣整潔、簡單、實用。Rxjava2相比Rxjava1優化和改動不少了東西,網上有很多大神寫的文章,這里就不粘貼復制了。封裝的過程有什么問題、疑問,請在下方留言。

下面話不多說了,來一起看看詳細的介紹吧

封裝教程如下:

核心網絡請求:

package com.lin.netrequestdemo.data;


import android.util.Log;

import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Consumer;
import io.reactivex.functions.Function;
import io.reactivex.schedulers.Schedulers;

public class RxNet {
 /**
 * 統一處理單個請求
 *
 * @param observable
 * @param callBack
 * @param <T>
 */
 public static <T> Disposable request(Observable<BaseResponse<T>> observable, final RxNetCallBack<T> callBack) {
 return observable.subscribeOn(Schedulers.io())
  .observeOn(AndroidSchedulers.mainThread())
  .onErrorReturn(new Function<Throwable, BaseResponse<T>>() {
   @Override
   public BaseResponse<T> apply(Throwable throwable) {
   Log.e("LinNetError", throwable.getMessage());
   callBack.onFailure(ExceptionHandle.handleException(throwable));
   return null;
   }
  })
  .subscribe(new Consumer<BaseResponse<T>>() {
   @Override
   public void accept(BaseResponse<T> tBaseResponse) {
   if (tBaseResponse.getCode().equals("200")) {
    callBack.onSuccess(tBaseResponse.getData());

   } else {
    callBack.onFailure(tBaseResponse.getMsg());
   }
   }
  }, new Consumer<Throwable>() {
   @Override
   public void accept(Throwable throwable) {
   Log.e("LinNetError", "單個請求的錯誤" + throwable.getMessage());
   }
  });
 }

 /**
 * 統一處理單個請求
 * 返回數據沒有body
 */
 public static Disposable requestWithoutBody(Observable<BaseResponse> observable,
      final RxNetCallBack<String> callBack) {
 return observable.subscribeOn(Schedulers.io())
  .observeOn(AndroidSchedulers.mainThread())
  .onErrorReturn(new Function<Throwable, BaseResponse>() {
   @Override
   public BaseResponse apply(Throwable throwable) {
   Log.v("LinNetError", throwable.getMessage());
   callBack.onFailure(ExceptionHandle.handleException(throwable));
   return null;
   }
  })
  .subscribe(new Consumer<BaseResponse>() {
   @Override
   public void accept(BaseResponse baseResponse) {
   if (baseResponse.getCode().equals("200")) {
    callBack.onSuccess(baseResponse.getMsg());
   } else {
    callBack.onFailure(baseResponse.getMsg());
   }
   }
  }, new Consumer<Throwable>() {
   @Override
   public void accept(Throwable throwable) {
   Log.v("LinNetError", "單個請求的錯誤:沒有body" + throwable.getMessage());
   }
  });

 }
}

回調就是普通的泛型的回調

package com.lin.netrequestdemo.data;


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

 /**
 * 數據請求失敗
 */
 void onFailure(String msg);
}

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

package com.lin.netrequestdemo.data;

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:

package com.lin.netrequestdemo.data.api;

import android.util.Log;

import com.lin.netrequestdemo.data.AppConstants;

import java.util.concurrent.TimeUnit;

import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;


public class ApiManager {

 private Retrofit client;

 private ApiManager() {
 client = new Retrofit.Builder()
  .baseUrl(AppConstants.Base_Url_Test)
  .client(initClient())
  .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
  .addConverterFactory(GsonConverterFactory.create())
  .build();
 }

 private static volatile MallApi INSTANCE;

 public static MallApi getInstance() {
 if (INSTANCE == null) {
  synchronized (ApiManager.class) {
  if (INSTANCE == null) {
   INSTANCE = new ApiManager().getMallApi();
  }
  }
 }
 return INSTANCE;
 }

 private MallApi getMallApi() {
 return client.create(MallApi.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("LinNet", message);
  }
 });
 //設定日志級別
 httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
 //延時
 builder.addInterceptor(httpLoggingInterceptor)
  .connectTimeout(10, TimeUnit.SECONDS)
  .readTimeout(10, TimeUnit.SECONDS)
  .writeTimeout(10, TimeUnit.SECONDS);
 return builder.build();
 }

}

怎么用:

showLoading();
 Map<String, String> map = new ArrayMap<>();
 map.put("action", "pricetrend");
 addCompositeDisposable(RxNet.request(ApiManager.getInstance().getCat(map), new RxNetCallBack<List<CatBean>>() {
  @Override
  public void onSuccess(List<CatBean> data) {
  hideLoading();
  showToast("獲取列表成功" + data.get(0).toString());
  }

  @Override
  public void onFailure(String msg) {
  hideLoading();
  showToast(msg);
  }
 }));

Demo奉上 https://github.com/FriendLin/NetRequestDemo(本地下載)

總結

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

冀州市| 新源县| 百色市| 定州市| 安泽县| 枣强县| 吴堡县| 唐河县| 长子县| 延安市| 南通市| 黄骅市| 深圳市| 富锦市| 加查县| 阿勒泰市| 柘城县| 贵港市| 华阴市| 永吉县| 从化市| 惠州市| 伊宁市| 图们市| 剑阁县| 玛多县| 聂荣县| 安阳县| 江永县| 阿拉善右旗| 灵宝市| 霍州市| 库尔勒市| 合川市| 湛江市| 清水河县| 耿马| 荆州市| 桐梓县| 巴东县| 桦甸市|