概述
目前RxJava和Retrofit結合使用已經是非常普遍了,網上關于這方面的文章也是層出不窮,其實大致的思想都是差不多的,今天我也來寫一篇關于RxJava與Retrofit的文章,聊一聊關于RxJava與Retrofit的封裝,盡可能的能讓其適用于大部分項目,以供大家在學習這方面的時候多一份參考。
首先我們需要去定義一個對應接口的Service和返回結果的統(tǒng)一處理的實體類
public class HttpResult<T> {
public int code;
public String message;
public T payload;
public boolean status;
public boolean isSuccess() {
return code == 200;
}
}
定義APIService
public interface APIService {
@GET("uri")
Flowable<HttpResult<PayloadBean>> getRegisterCode(@QueryMap Map<String, String> params);//請求驗證碼
}
定義封裝Retrofit處理類
public class RetrofitHttpUtil {
private static final String BASE_URL = "baseurl";
public APIService apiService;
private static Retrofit retrofit = null;
private static OkHttpClient okHttpClient = null;
private Context mContext;
//緩存設置0不緩存
private boolean isUseCache;
private int maxCacheTime = 60;
public void setMaxCacheTime(int maxCacheTime) {
this.maxCacheTime = maxCacheTime;
}
public void setUseCache(boolean useCache) {
isUseCache = useCache;
}
public APIService getService() {
if (apiService == null && retrofit != null) {
apiService = retrofit.create(APIService.class);
}
return apiService;
}
public void init(Context context) {
this.mContext = context;
initOkHttp();
initRetrofit();
if (apiService == null) {
apiService = retrofit.create(APIService.class);
}
}
private void initOkHttp() {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.connectTimeout(15, TimeUnit.SECONDS);
builder.readTimeout(20, TimeUnit.SECONDS);
builder.writeTimeout(20, TimeUnit.SECONDS);
//錯誤重連
builder.retryOnConnectionFailure(true);
okHttpClient = builder.build();
}
private void initRetrofit() {
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
}
public <T> void toSubscribe(Flowable<T> o, Subscriber<T> s) {
o.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(s);
}
//統(tǒng)一處理請求結果
public class HttpResultFunc<T> implements Function<HttpResult<T>, T> {
@Override
public T apply(HttpResult<T> httpResult) throws Exception {
Log.e("xixi", httpResult.code + "--" + httpResult.message + "");
if (!httpResult.isSuccess()) {
throw new APIException(httpResult.code, httpResult.message);
}
return httpResult.payload;
}
}
}
定義API管理類
public class APIFactory<T> extends RetrofitHttpUtil {
public void getRegisterCode(final Map<String, String> params, final NetRequestAdapter<PayloadBean> calback) {
Flowable<PayloadBean> registerCode = apiService.getRegisterCode(params)
.map(new HttpResultFunc<PayloadBean>());
toSubscribe(registerCode, calback);
}
}
定義適配器 將Subscriber適配為NetworkRequestCalback(只是自定義的回調)
public class NetRequestAdapter<T> implements Subscriber<T> {
private NetworkRequestCalback calback;
public NetRequestAdapter(NetworkRequestCalback calback) {
this.calback = calback;
}
@Override
public void onSubscribe(Subscription s) {
calback.onNetStart();
}
@Override
public void onError(Throwable throwable) {
if (throwable instanceof SocketTimeoutException) {
if (calback != null) {
calback.onError(C.net.NETERROR, "網絡中斷,請檢查您的網絡狀態(tài)");
}
} else if (throwable instanceof ConnectException) {
if (calback != null) {
calback.onError(C.net.NETERROR, "網絡中斷,請檢查您的網絡狀態(tài)");
}
} else if (throwable instanceof APIException) {
if (calback != null) {
calback.onError(((APIException) throwable).getCode(), ((APIException) throwable).getMessage());
}
} else {
if (calback != null) {
throwable.printStackTrace();
calback.onError(C.net.UNKONWERROR, "未知錯誤,請重試");
}
}
}
@Override
public void onNext(T t) {
calback.onSuccess(t);
}
@Override
public void onComplete() {
calback.onNetFinish();
}
}
如何使用:
HashMap<String, String> params = new HashMap<>();
params.put("account", mobile_register.getEditText().getText().toString());
APIFactory<PayloadBean> responseHandle = new APIFactory();
responseHandle.init(getContext());
responseHandle.getRegisterCode(params, new NetRequestAdapter<PayloadBean>(this));
就到這里了