android——rxjava异步Consumer类似promise、重试机制、网络请求失败重试、合并两个异步都完成才往下运行、实现数据缓存优先加载
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、重试机制、网络请求失败重试、合并两个异步都完成才往下运行、实现数据缓存优先加载相关推荐
- Android RecyclerView封装下拉刷新与上拉加载更多
1 scanlistlibrary 基础组件说明(基于 RecyclerView的封装) 基本数据列表(支持下拉刷新与上拉加载更多) 九宫格数据显示封装(支持下拉刷新与上拉加载更多) 瀑布流数据显示封 ...
- 【Android归纳】基于XListView的下拉刷新、上拉加载更多的控件分析
目录 前言 功能介绍 总体设计 组成 类关系图 详细设计 XlistViewHeader原理分析 XListViewFooter原理分析 XListView原理分析 代码带注释下载 目录 前言 如果你 ...
- Android下拉刷新、上拉加载更多组件FlyRefreshLayout详解
舞动着键盘和鼠标,我誓言要把这个世界写的明明白白 本文出自门心叼龙的博客,属于原创类容,转载请注明出处.https://blog.csdn.net/geduo_83/article/details/8 ...
- JS基础之网络请求失败自动重试
当我们在进行网络请求的时候,有时候由于信号不好等因素导致网络请求失败,这时我们通常就直接返回了,这不够优雅,更好的处理方式时能进行自动重试. 假设我们的网络请求代码如下: // 伪代码 functio ...
- Android RecyclerView(八)设置自定义 下拉刷新 与 上拉加载数据
Android RecyclerView(八)设置下拉刷新 与 上拉加载数据 GitHub 项目源码 CSDN 博客说明 智慧安卓App 文章分析 下拉刷新效果 上拉加载数据效果 1 xml布局文件中 ...
- Android 9.0/P(android p指安卓9.0版本) okhttp3网络请求出错
已经在AndroidManifest.xml申请网络权限,在8.0以下的系统中网络访问正常,但是9.0中出现网络请求失败 Android 9.0的网络请求失败如下图: 出现这个错误的原因是:从Andr ...
- Android 微博实时热点获取(GET)网络请求
Android 微博实时热点获取(GET)网络请求 首先在xml文件上界面布局 这边采用LinearLayour布局,首先添加TextView控件来显示标题,第二采用RecyclerView列表控件来 ...
- android json解析异常,json数据解析异常而导致网络请求失败的解决办法(其一)
问题概述 笔者在开发过程中临时遇到一个本来仅有web端的项目临时增加Android端,导致后端在出接口时并未考虑Android端的json数据的解析,导致接口是这样的.... 正确请求 { " ...
- Android 避免主线程执行网络请求之Activity/Fragment 结束后处理异步回调
大家都知道Android涉及到与UI相关的操作只能在主线程执行 android4.0以后就禁止在主线程进行网络请求了,在主线程里面执行Http请求都会报NetworkOnMainThreadExcep ...
最新文章
- C#中的get和post请求(工具类)
- [蓝桥杯]2016蓝桥省赛B组题目及详解
- 介绍两款Docker可视化工具
- PowerDesigner提示This data item is already used in a primary identifier.的处理
- C和指针之字符串编程练习10(判断字符串是否是回文数)
- 【Ynoi2011】成都七中【树论】【点分树】【离线】【树状数组】
- Java 算法 瓷砖铺放
- 共建智慧云基石,阿里云携手英特尔走向数智未来
- DOS批处理全面教程
- go 类型断言_深入理解Go的interface内部执行原理
- ajax分页效果、分类联动、搜索功能
- Android6.0之AMS启动
- PREEvision软件-汽车电子电气架构的开发工具
- iphone捷径大全_iPhone捷径,助您一臂之力
- 微信小程序 实现路线规划
- 尺寸链计算-尺寸公差分析-的国产化之路
- 360极速浏览器显示密码
- css背景图重复怎们弄,CSS如何实现背景图像重复效果
- Python:实现费马检测算法(附完整源码)
- STM32F103C8T6平衡车