溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2020-08-25 16:16:34 來(lái)源:腳本之家 閱讀:243 作者:林祖朋 欄目:移動(dòng)開(kāi)發(fā)

前言

RxJava和Retrofit2用了一段時(shí)間了,寫(xiě)個(gè)小例子,分享出來(lái),有什么不對(duì)的地方還請(qǐng)大神在評(píng)論區(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)確,他的大概意思是說(shuō):Retrofit 是一個(gè) java 接口類,以注解的方式用于 HTTP 網(wǎng)絡(luò)請(qǐng)求。那下面我們一起來(lái)看看是怎么使用的?

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

最近在幫兄弟公司做一個(gè)資訊類的項(xiàng)目,使用了RxJava和Retrofit2這對(duì)黃金組合,在編寫(xiě)代碼的過(guò)程中發(fā)現(xiàn)有很多很多的網(wǎng)絡(luò)請(qǐng)求都需要做.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).onErrorReturn()的處理,為避免這樣,需要沉思。

解決問(wèn)題

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)一處理單個(gè)請(qǐ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)一處理單個(gè)請(qǐng)求沒(méi)有 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ù)請(qǐng)求成功
  *
  * @param data 請(qǐng)求到的數(shù)據(jù)
  */
 void onSuccess(T data);

 /**
  * 數(shù)據(jù)請(qǐng)求失敗
  */
 void onFailure(String msg);
}

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

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ò)錯(cuò)誤";
     break;
   }
   return errorMsg + ":" + httpException.code();
  } else if (e instanceof JsonParseException || e instanceof JSONException || e instanceof ParseException) {
   return "解析錯(cuò)誤";
  } else if (e instanceof ConnectException) {
   return "連接失敗";
  } else if (e instanceof javax.net.ssl.SSLHandshakeException) {
   return "證書(shū)驗(yàn)證失敗";
  } else if (e instanceof ConnectTimeoutException) {
   return "連接超時(shí)";
  } else if (e instanceof java.net.SocketTimeoutException) {
   return "連接超時(shí)";
  } else {
   return "未知錯(cuò)誤";
  }
 }
}

然后就是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è)定日志級(jí)別
  httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
  //延時(shí)
  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)了錯(cuò)誤
    showToast(msg);
    
   }
  });

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

總結(jié)

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

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI