RxJava 平常使用
本文转载自:
http://blog.csdn.net/theone10211024/article/details/50435325
一、Scheduler线程切换
这种场景经常会在“后台线程取数据,主线程展示”的模式中看见
- Observable.just(1, 2, 3, 4)
- .subscribeOn(Schedulers.io()) // 指定 subscribe() 发生在 IO 线程
- .observeOn(AndroidSchedulers.mainThread()) // 指定 Subscriber 的回调发生在主线程
- .subscribe(new Action1<Integer>() {
- @Override
- public void call(Integer number) {
- Log.d(tag, "number:" + number);
- }
- });
二、使用debounce做textSearch
用简单的话讲就是当N个结点发生的时间太靠近(即发生的时间差小于设定的值T),debounce就会自动过滤掉前N-1个结点。
比如在做百度地址联想的时候,可以使用debounce减少频繁的网络请求。避免每输入(删除)一个字就做一次联想
- RxTextView.textChangeEvents(inputEditText)
- .debounce(400, TimeUnit.MILLISECONDS)
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(new Observer<TextViewTextChangeEvent>() {
- @Override
- public void onCompleted() {
- log.d("onComplete");
- }
- @Override
- public void onError(Throwable e) {
- log.d("Error");
- }
- @Override
- public void onNext(TextViewTextChangeEvent onTextChangeEvent) {
- log.d(format("Searching for %s", onTextChangeEvent.text().toString()));
- }
- });
三、Retrofit结合RxJava做网络请求框架
这里不作详解,具体的介绍可以看扔物线的这篇文章,对RxJava的入门者有很大的启发。其中也讲到了RxJava和Retrofit如何结合来实现更简洁的代码
四、RxJava代替EventBus进行数据传递:RxBus
注意:RxBus并不是一个库,而是一种模式,是使用了RxJava的思想来达到EventBus的数据传递效果。这篇文章把RxBus讲的比较详细。
五、使用combineLatest合并最近N个结点
例如:注册的时候所有输入信息(邮箱、密码、电话号码等)合法才点亮注册按钮。
- Observable<CharSequence> _emailChangeObservable = RxTextView.textChanges(_email).skip(1);
- Observable<CharSequence> _passwordChangeObservable = RxTextView.textChanges(_password).skip(1);
- Observable<CharSequence> _numberChangeObservable = RxTextView.textChanges(_number).skip(1);
- Observable.combineLatest(_emailChangeObservable,
- _passwordChangeObservable,
- _numberChangeObservable,
- new Func3<CharSequence, CharSequence, CharSequence, Boolean>() {
- @Override
- public Boolean call(CharSequence newEmail,
- CharSequence newPassword,
- CharSequence newNumber) {
- Log.d("xiayong",newEmail+" "+newPassword+" "+newNumber);
- boolean emailValid = !isEmpty(newEmail) &&
- EMAIL_ADDRESS.matcher(newEmail).matches();
- if (!emailValid) {
- _email.setError("Invalid Email!");
- }
- boolean passValid = !isEmpty(newPassword) && newPassword.length() > 8;
- if (!passValid) {
- _password.setError("Invalid Password!");
- }
- boolean numValid = !isEmpty(newNumber);
- if (numValid) {
- int num = Integer.parseInt(newNumber.toString());
- numValid = num > 0 && num <= 100;
- }
- if (!numValid) {
- _number.setError("Invalid Number!");
- }
- return emailValid && passValid && numValid;
- }
- })//
- .subscribe(new Observer<Boolean>() {
- @Override
- public void onCompleted() {
- log.d("completed");
- }
- @Override
- public void onError(Throwable e) {
- log.d("Error");
- }
- @Override
- public void onNext(Boolean formValid) {
- _btnValidIndicator.setEnabled(formValid);
- }
- });
六、使用merge合并两个数据源。
例如一组数据来自网络,一组数据来自文件,需要合并两组数据一起展示。
- Observable.merge(getDataFromFile(), getDataFromNet())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(new Subscriber<String>() {
- @Override
- public void onCompleted() {
- log.d("done loading all data");
- }
- @Override
- public void onError(Throwable e) {
- log.d("error");
- }
- @Override
- public void onNext(String data) {
- log.d("all merged data will pass here one by one!")
- });
七、使用concat和first做缓存
依次检查memory、disk和network中是否存在数据,任何一步一旦发现数据后面的操作都不执行。
- Observable<String> memory = Observable.create(new Observable.OnSubscribe<String>() {
- @Override
- public void call(Subscriber<? super String> subscriber) {
- if (memoryCache != null) {
- subscriber.onNext(memoryCache);
- } else {
- subscriber.onCompleted();
- }
- }
- });
- Observable<String> disk = Observable.create(new Observable.OnSubscribe<String>() {
- @Override
- public void call(Subscriber<? super String> subscriber) {
- String cachePref = rxPreferences.getString("cache").get();
- if (!TextUtils.isEmpty(cachePref)) {
- subscriber.onNext(cachePref);
- } else {
- subscriber.onCompleted();
- }
- }
- });
- Observable<String> network = Observable.just("network");
- //依次检查memory、disk、network
- Observable.concat(memory, disk, network)
- .first()
- .subscribeOn(Schedulers.newThread())
- .subscribe(s -> {
- memoryCache = "memory";
- System.out.println("--------------subscribe: " + s);
- });
八、使用timer做定时操作。当有“x秒后执行y操作”类似的需求的时候,想到使用timer
例如:2秒后输出日志“hello world”,然后结束。
- Observable.timer(2, TimeUnit.SECONDS)
- .subscribe(new Observer<Long>() {
- @Override
- public void onCompleted() {
- log.d ("completed");
- }
- @Override
- public void onError(Throwable e) {
- log.e("error");
- }
- @Override
- public void onNext(Long number) {
- log.d ("hello world");
- }
- });
九、使用interval做周期性操作。当有“每隔xx秒后执行yy操作”类似的需求的时候,想到使用interval
例如:每隔2秒输出日志“helloworld”。
- Observable.interval(2, TimeUnit.SECONDS)
- .subscribe(new Observer<Long>() {
- @Override
- public void onCompleted() {
- log.d ("completed");
- }
- @Override
- public void onError(Throwable e) {
- log.e("error");
- }
- @Override
- public void onNext(Long number) {
- log.d ("hello world");
- }
- });
十、使用throttleFirst防止按钮重复点击
ps:debounce也能达到同样的效果
- RxView.clicks(button)
- .throttleFirst(1, TimeUnit.SECONDS)
- .subscribe(new Observer<Object>() {
- @Override
- public void onCompleted() {
- log.d ("completed");
- }
- @Override
- public void onError(Throwable e) {
- log.e("error");
- }
- @Override
- public void onNext(Object o) {
- log.d("button clicked");
- }
- });
十一、使用schedulePeriodically做轮询请求
- Observable.create(new Observable.OnSubscribe<String>() {
- @Override
- public void call(final Subscriber<? super String> observer) {
- Schedulers.newThread().createWorker()
- .schedulePeriodically(new Action0() {
- @Override
- public void call() {
- observer.onNext(doNetworkCallAndGetStringResult());
- }
- }, INITIAL_DELAY, POLLING_INTERVAL, TimeUnit.MILLISECONDS);
- }
- }).subscribe(new Action1<String>() {
- @Override
- public void call(String s) {
- log.d("polling….”));
- }
- })
十二、RxJava进行数组、list的遍历
- String[] names = {"Tom", "Lily", "Alisa", "Sheldon", "Bill"};
- Observable
- .from(names)
- .subscribe(new Action1<String>() {
- @Override
- public void call(String name) {
- log.d(name);
- }
- });
十三、解决嵌套回调(callback hell)问题
- NetworkService.getToken("username", "password")
- .flatMap(s -> NetworkService.getMessage(s))
- .subscribe(s -> {
- System.out.println("message: " + s);
- })
十四、响应式的界面
比如勾选了某个checkbox,自动更新对应的preference
- SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
- RxSharedPreferences rxPreferences = RxSharedPreferences.create(preferences);
- Preference<Boolean> checked = rxPreferences.getBoolean("checked", true);
- CheckBox checkBox = (CheckBox) findViewById(R.id.cb_test);
- RxCompoundButton.checkedChanges(checkBox)
- .subscribe(checked.asAction());
RxJava 平常使用的更多相关文章
- RxJava学习入门
RxJava是什么 一个词:异步. RxJava 在 GitHub 主页上的自我介绍是 "a library for composing asynchronous and event-bas ...
- Android中使用反应式编程RxJava
GitHut 地址: https://github.com/ReactiveX/RxAndroid (1)RxJava简介: RxJava 是一个在Java虚拟机上实现的响应式扩展库:提供了基于obs ...
- MVP+Dagger2+Rxjava+Retrofit+GreenDao 小应用,包含新闻、图片、视频3个大模块,代码整洁干练
练习MVP架构开发的App,算是对自己学过的知识做一个总结,做了有一段时间,界面还算挺多的,代码量还是有的,里面做了大量封装,整体代码整理得很干净,这个我已经尽力整理了.不管是文件(Java.xml. ...
- android打飞机游戏、MVP句子迷App、悬浮窗、RxJava+Retrofit、加载动画、定制计划App等源码
Android精选源码 微信打飞机 android进度设置加载效果源码 Android新手引导库EasyGuide MVP-好看又好用的句子迷客户端 XFloatView 一个简易的悬浮窗实现方案 a ...
- Android性能优化之利用Rxlifecycle解决RxJava内存泄漏
前言: 其实RxJava引起的内存泄漏是我无意中发现了,本来是想了解Retrofit与RxJava相结合中是如何通过适配器模式解决的,结果却发现了RxJava是会引起内存泄漏的,所有想着查找一下资料学 ...
- Android消息传递之基于RxJava实现一个EventBus - RxBus
前言: 上篇文章学习了Android事件总线管理开源框架EventBus,EventBus的出现大大降低了开发成本以及开发难度,今天我们就利用目前大红大紫的RxJava来实现一下类似EventBus事 ...
- 【知识必备】RxJava+Retrofit二次封装最佳结合体验,打造懒人封装框架~
一.写在前面 相信各位看官对retrofit和rxjava已经耳熟能详了,最近一直在学习retrofit+rxjava的各种封装姿势,也结合自己的理解,一步一步的做起来. 骚年,如果你还没有掌握ret ...
- Android MVP+Retrofit+RxJava实践小结
关于MVP.Retrofit.RxJava,之前已经分别做了分享,如果您还没有阅读过,可以猛戳: 1.Android MVP 实例 2.Android Retrofit 2.0使用 3.RxJava ...
- 【腾讯Bugly干货分享】基于RxJava的一种MVP实现
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57bfef673c1174283d60bac0 Dev Club 是一个交流移动 ...
随机推荐
- .net中的多线程
一.多线程的概念 什么是进程呢?当一个程序开始运行时,它就是一个进程,进程所指包括运行中的程序和程序所使用到的内存和系统资源.而一个进程又是由多个线程所组成的,线程是程序中的一个执行流, ...
- C# 使用GDI+绘制漂亮的MenuStrip和ContextMenuStrip皮肤
通过上面的效果截图可以看到,重绘后的MenuStrip和ContextMenuStrip可以添加自己的LOGO信息,实现了类似OFFICE2007的菜单显示效果. .NET对菜单控件的绘制提供了一个抽 ...
- 1.6.9 UIMA Integration
1. UIMA 集成 你可以使用solr集成Apache的非结构化信息管理架构(UIMA).UIMA可以让你定义自己的分析引擎通道,逐步添加元数据到文档的标注. 关于Solr UIMA的更多信息,参考 ...
- (一)u-boot2013.01.01 for TQ210:《Uboot简介》
一直想写一个s5pv210硬件平台的u-boot的移植文档,但一直都忙着没时间写.先写一些u-boot的脚本分析吧,包括makefile,mkconfig,config.mk,主要侧重于语法句意的分析 ...
- android studio1.3安装终于成功
本人机器是win7 32位旗舰版,4G内存.以前使用eclipse adt bundle开发Android程序感觉非常方便,但随着google对andriod studio支持力度加大,转向studi ...
- MVC4 Forms 验证,部署到Hyper-v上.FormsAuthentication.SetAuthCookie无效的问题
这是IE10的一个bug或者说是asp.net4的一个Bug,在IE10里更改了http头,这样导致asp.net4认为客户端没有启用cookie,会导致验证失败.简单的解决方法是,在网站根目录,新增 ...
- mybatis--MapperProxy事务
上篇 详细分析了org.mybatis.spring.mapper.MapperScannerConfigurer 和 org.mybatis.spring.SqlSessionFactoryBean ...
- python 基础——多重继承
原始的初始化 子类直接调用超类 __init__ 方法初始化,当形成钻石继承的时候,超类会被多次初始化,可能会有意向不到的问题: BaseClass / \ OneClass Tw ...
- [转]Advanced Oracle SQL Developer Features
本文转自:http://www.oracle.com/technetwork/cn/server-storage/linux/sqldev-adv-otn-092384.html Advanced O ...
- LeetCode 337
House Robber III The thief has found himself a new place for his thievery again. There is only one e ...