欢迎来到代码驿站!

Android代码

当前位置:首页 > 移动开发 > Android代码

RxJava2和Retrofit2封装教程(整洁、简单、实用)

时间:2021-03-27 09:31:46|栏目:Android代码|点击:

前言

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本地下载

总结

上一篇:Android 编程下字库的使用及注意事项

栏    目:Android代码

下一篇:android商品详情页面设计详解

本文标题:RxJava2和Retrofit2封装教程(整洁、简单、实用)

本文地址:http://www.codeinn.net/misctech/89270.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有