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

前言

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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • 基于RxJava2实现的简单图片爬虫的方法

    今年十月份以来,跟朋友尝试导入一些图片到tensorflow来生成模型,这就需要大量的图片.刚开始我只写了一个简单的HttpClient程序来抓取图片,后来为了通用性索性写一个简单的图片爬虫程序.它可以用于抓取单张图片.多张图片.某个网页下的所有图片.多个网页下的所有图片. github地址:https://github.com/fengzhizi715/PicCrawler 这个爬虫使用了HttpClient.RxJava2以及Java 8的一些特性.它支持一些简单的定制,比如定制User-A

  • 基于Retrofit2+RxJava2实现Android App自动更新

    本文实例为大家分享了Retrofit2 RxJava2实现Android App自动更新,具体内容如下 功能解析 自动更新可以说已经是App的标配了,很多第三方平台也都支持这个功能,最近手头上的项目需要加入这个App自动更新,考虑到项目里有用到Retrofit2和RxJava2,于是打算使用它俩自己实现这个功能. 分析App自动更新,可以分为以下三个功能点: 1.APK文件的下载 2.下载进度的实时更新显示 3.下载完成后的自动安装 其中比较难的一点是下载进度的实时更新显示,更难的是如何优雅的进

  • 谈谈RxJava2中的异常及处理方法

    前言 众所周知,RxJava2 中当链式调用中抛出异常时,如果没有对应的 Consumer 去处理异常,则这个异常会被抛出到虚拟机中去,Android 上的直接表现就是 crash,程序崩溃. 订阅方式 说异常处理前咱们先来看一下 RxJava2 中 Observable 订阅方法 subscribe() 我们常用的几种订阅方式: // 1 subscribe() // 2 Disposable subscribe(Consumer<? super T> onNext) // 3 Dispos

  • 详解RxJava2 Retrofit2 网络框架简洁轻便封装

    前言 RxJava2.Retrofit2火了有一段时间了,前段时间给公司的项目引入了这方面相关的技术,在此记录一下相关封装的思路. 需求 封装之前要先明白需要满足哪些需求. RxJava2衔接Retrofit2 Retrofit2网络框架异常的统一处理 兼容fastjson(可选) RxJava2内存泄漏的处理 异步请求加入Loading Dialog 依赖 implementation 'io.reactivex.rxjava2:rxandroid:2.0.1' implementation

  • RxJava2配置及使用详解

    RxJava2.0是一个非常棒的流式编程,采用的观察者模式思想,事件的产生者产生事间之后发送给绑定的接受者,接受顺序与发送顺序一致. 依赖: compile 'io.reactivex.rxjava2:rxjava:2.0.1' compile 'io.reactivex.rxjava2:rxandroid:2.0.1' 简单使用: //观察者模式,这里产生事件,事件产生后发送给接受者,但是一定要记得将事件的产生者和接收者捆绑在一起,否则会出现错误 Observable.create(new O

  • Rxjava2_Flowable_Sqlite_Android数据库访问实例

    一.使用Rxjava访问数据库的优点: 1.随意的线程控制,数据库操作在一个线程,返回数据处理在ui线程 2.随时订阅和取消订阅,而不必再使用回调函数 3.对读取的数据用rxjava进行过滤,流式处理 4.使用sqlbrite可以原生返回rxjava的格式,同时是响应式数据库框架 (有数据添加和更新时自动调用之前订阅了的读取函数,达到有数据添加自动更新ui的效果, 同时这个特性没有禁止的方法,只能通过取消订阅停止这个功能,对于有的框架这反而是一种累赘) 二.接下来之关注实现过程: 本次实现用rx

  • RxJava2.x+ReTrofit2.x多线程下载文件的示例代码

    写在前面: 接到公司需求:要做一个apk升级的功能,原理其实很简单,百度也一大堆例子,可大部分都是用框架,要么就是HttpURLConnection,实在是不想这么干.正好看了两天的RxJava2.x+ReTrofit2.x,据说这俩框架是目前最火的异步请求框架了.固本文使用RxJava2.x+ReTrofit2.x实现多线程下载文件的功能. 如果对RxJava2.x+ReTrofit2.x不太了解的请先去看相关的文档. 大神至此请无视. 思路分析: 思路及其简洁明了,主要分为以下四步 1.获取

  • Android 使用 RxJava2 实现倒计时功能的示例代码

    倒计时功能被广泛运用在 App 启动页.短信验证码倒计时等,通常做法是起一个Handler ,在子线程里完成倒计时,如今这一做法有了替代品 -- RxJava ,RxJava是被行内一致认可的第三方开源库,我们可以使用RxJava实现倒计时功能. 示例图: 示例代码: 导入必要的库文件(Android支持库和Reactivex系列支持库) implementation 'com.android.support:appcompat-v7:27.1.0' implementation 'com.an

  • Android 用RxBinding与RxJava2实现短信验证码倒计时功能

    场景:注册账号页面时,我们点击按钮发送验证码,在等待验证码时,界面会有倒计时提示,这此期间按钮不可点击.当倒计时结束时,按钮恢复. 实现与功能都不难,这次用 RxBinding,RxJava2 的方法去实现.并实现了手动.自动停止倒计时,防止多次点击. 功能动态图 要使用 RxBinding.RxJava2 先添加 Gradle 配置: compile 'io.reactivex.rxjava2:rxandroid:2.0.1' compile 'io.reactivex.rxjava2:rxj

  • RxJava2.x实现定时器的实例代码

    前言 由于现在网络层已经升级到RxJava2.x相关的了,所以需要做些调整.虽然RxJava1.x和RxJava2.x同属RxJava系列,但由于RxJava2.x部分代码的重写,导致RxJava2.x与RxJava1.x已是两个不同的版本,RxJava2.x在性能上更优,尤其在背压支持上.当然,此篇重点不在Rx版本上的区别,有兴趣的同学可以自行研究.当然,2.x之于1.x的区别之一是2.x中已经没有 Subscription mSubscription, Observable.create()

随机推荐