1、rxjava异步Consumer

导入fxjava包:

implementation 'io.reactivex.rxjava3:rxjava:3.0.6'
// rxBinding已经依赖了rxJava,可以无需再重复依赖rxJava
implementation 'com.jakewharton.rxbinding4:rxbinding:4.0.0'

使用:

getAsync(res -> {System.out.println("返回执行:" + res);});

异步方法:

public void getAsync(Consumer<String> consumer) {new Thread(new Runnable() {@Overridepublic void run() {try {Thread.sleep(5000); // 延时5s} catch (InterruptedException e) {e.printStackTrace();}if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {consumer.accept("返回成功"); // 关键代码}}}).start();}

异步延时5s返回,打印 “返回执行返回成功”

2、合并两个异步都完成才往下运行

public void loadData(){Observable.zip(observableOne(), observableTwo(), new BiFunction<String, String, String>() {@Overridepublic String apply(String a, String b) {return a + b;//合并数据}}).subscribe(new Consumer<String>() {@Overridepublic void accept(String o) {Log.d("TAG==>", o);//两个异步都运行结束才执行这里}});}/*** 异步一* @return*/private Observable observableOne(){Observable observable1 = Observable.create(new ObservableOnSubscribe<String>() {@Overridepublic void subscribe(ObservableEmitter<String> emitter) throws Exception {SystemClock.sleep(5000);emitter.onNext("我是第一");emitter.onComplete();}}).subscribeOn(Schedulers.io());return observable1;}/*** 异步二* @return*/private Observable observableTwo(){Observable observable2 = Observable.create(new ObservableOnSubscribe<String>() {@Overridepublic void subscribe(ObservableEmitter<String> emitter) throws Exception {emitter.onNext("我是第二");emitter.onComplete();}}).subscribeOn(Schedulers.io());return  observable2;}

3、实现数据缓存优先加载

分别从缓存,硬盘,网络后台获取数据,只要其中一个有数据,后续就停止进行

String memoryCache;
String diskCache="我是硬盘数据";public void loadData() {Observable.concat(memoryData(), diskData(), networkData()).firstElement().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<String>() {@Overridepublic void accept(String o) {Log.d("获取到的数据为==>", o);}});}/*** 异步一:从缓存获取数据** @return*/private Observable memoryData() {Observable<String> memory = Observable.create(new ObservableOnSubscribe<String>() {@Overridepublic void subscribe(ObservableEmitter<String> emitter) {// 判断是否有数据if (!TextUtils.isEmpty(memoryCache)) {emitter.onNext(memoryCache);} else {emitter.onComplete();}}});return memory;}/*** 异步二:从硬盘获取数据** @return*/private Observable diskData() {Observable<String> disk = Observable.create(new ObservableOnSubscribe<String>() {@Overridepublic void subscribe(ObservableEmitter<String> emitter) throws Exception {// 判断是否有数据if (!TextUtils.isEmpty(diskCache)) {emitter.onNext(diskCache);} else {emitter.onComplete();}}});return disk;}/*** 异步三:模仿网络请求** @return*/private Observable networkData() {Observable<String> network = Observable.defer(new Supplier<ObservableSource<? extends String>>() {@Overridepublic ObservableSource<? extends String> get() {SystemClock.sleep(5000);//延时5秒,模仿网络请求return Observable.just("我是网络数据");}});return network;}

4、网络请求失败重试

方式一:

Single.create((SingleOnSubscribe<Integer>) emitter -> {//这里用网络请求emitter.onSuccess(1);//请求成功
//                emitter.onError(new RuntimeException("请求接口异常..."));//请求失败}).retry((integer, throwable) -> {Log.d("wangyao", "检测是否需要重试:" + integer);//失败一次integer会自动+1return integer < 3;}).subscribe(integer -> {Log.d("wangyao", "请求成功:" + integer);}, throwable -> {Log.d("wangyao", "请求失败:" + throwable);});

方式二:

infoApi.getUserInfo()//总共重试3次,重试间隔3000毫秒.retryWhen(new RetryWithDelay(3, 3000)).observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.io()).subscribe(new Action1<Response>() {@Overridepublic void call(Response response) {String content = new String(((TypedByteArray) response.getBody()).getBytes());printLog(tvLogs, "", content);}}, new Action1<Throwable>() {@Overridepublic void call(Throwable throwable) {throwable.printStackTrace();}});

android——rxjava异步Consumer类似promise、重试机制、网络请求失败重试、合并两个异步都完成才往下运行、实现数据缓存优先加载相关推荐

  1. Android RecyclerView封装下拉刷新与上拉加载更多

    1 scanlistlibrary 基础组件说明(基于 RecyclerView的封装) 基本数据列表(支持下拉刷新与上拉加载更多) 九宫格数据显示封装(支持下拉刷新与上拉加载更多) 瀑布流数据显示封 ...

  2. 【Android归纳】基于XListView的下拉刷新、上拉加载更多的控件分析

    目录 前言 功能介绍 总体设计 组成 类关系图 详细设计 XlistViewHeader原理分析 XListViewFooter原理分析 XListView原理分析 代码带注释下载 目录 前言 如果你 ...

  3. Android下拉刷新、上拉加载更多组件FlyRefreshLayout详解

    舞动着键盘和鼠标,我誓言要把这个世界写的明明白白 本文出自门心叼龙的博客,属于原创类容,转载请注明出处.https://blog.csdn.net/geduo_83/article/details/8 ...

  4. JS基础之网络请求失败自动重试

    当我们在进行网络请求的时候,有时候由于信号不好等因素导致网络请求失败,这时我们通常就直接返回了,这不够优雅,更好的处理方式时能进行自动重试. 假设我们的网络请求代码如下: // 伪代码 functio ...

  5. Android RecyclerView(八)设置自定义 下拉刷新 与 上拉加载数据

    Android RecyclerView(八)设置下拉刷新 与 上拉加载数据 GitHub 项目源码 CSDN 博客说明 智慧安卓App 文章分析 下拉刷新效果 上拉加载数据效果 1 xml布局文件中 ...

  6. Android 9.0/P(android p指安卓9.0版本) okhttp3网络请求出错

    已经在AndroidManifest.xml申请网络权限,在8.0以下的系统中网络访问正常,但是9.0中出现网络请求失败 Android 9.0的网络请求失败如下图: 出现这个错误的原因是:从Andr ...

  7. Android 微博实时热点获取(GET)网络请求

    Android 微博实时热点获取(GET)网络请求 首先在xml文件上界面布局 这边采用LinearLayour布局,首先添加TextView控件来显示标题,第二采用RecyclerView列表控件来 ...

  8. android json解析异常,json数据解析异常而导致网络请求失败的解决办法(其一)

    问题概述 笔者在开发过程中临时遇到一个本来仅有web端的项目临时增加Android端,导致后端在出接口时并未考虑Android端的json数据的解析,导致接口是这样的.... 正确请求 { " ...

  9. Android 避免主线程执行网络请求之Activity/Fragment 结束后处理异步回调

    大家都知道Android涉及到与UI相关的操作只能在主线程执行 android4.0以后就禁止在主线程进行网络请求了,在主线程里面执行Http请求都会报NetworkOnMainThreadExcep ...

最新文章

  1. C#中的get和post请求(工具类)
  2. [蓝桥杯]2016蓝桥省赛B组题目及详解
  3. 介绍两款Docker可视化工具
  4. PowerDesigner提示This data item is already used in a primary identifier.的处理
  5. C和指针之字符串编程练习10(判断字符串是否是回文数)
  6. 【Ynoi2011】成都七中【树论】【点分树】【离线】【树状数组】
  7. Java 算法 瓷砖铺放
  8. 共建智慧云基石,阿里云携手英特尔走向数智未来
  9. DOS批处理全面教程
  10. go 类型断言_深入理解Go的interface内部执行原理
  11. ajax分页效果、分类联动、搜索功能
  12. Android6.0之AMS启动
  13. PREEvision软件-汽车电子电气架构的开发工具
  14. iphone捷径大全_iPhone捷径,助您一臂之力
  15. 微信小程序 实现路线规划
  16. 尺寸链计算-尺寸公差分析-的国产化之路
  17. 360极速浏览器显示密码
  18. css背景图重复怎们弄,CSS如何实现背景图像重复效果
  19. Python:实现费马检测算法(附完整源码)
  20. STM32F103C8T6平衡车

热门文章

  1. 【Java面向对象】学习Java经典必刷题库
  2. 【秒杀项目02】exception异常模块总结
  3. 雷军称要做业余汽车博主;iPhone关机后仍在运行,或成恶意软件温床;奈飞宣布裁员150人|极客头条
  4. Android自定义弹出菜单+动画实现
  5. 有了MacBook,你还缺点啥?
  6. JS经典面试题:JS原型、原型链
  7. 手机突然黑屏,开不了机
  8. 如何解决代理网络不好的问题?
  9. 设置background-color背景色为全透明
  10. 扩展Unity3d编辑器,批量修改Label字体颜色