上一篇,整了个利用RxJava下载图片刷UI的一个小案例,从者一篇开始将要一部分一部分的“拆”RxJava(会写一系列,每一篇内容精良精简)
那从何学起?官网Wiki:https://github.com/ReactiveX/RxJava/wiki/How-To-Use-RxJava
先从简单的from() 和just()方法开始,先看下例子实现的内容(2部分,一个类似于短信验证码等待的操作,一个就是遍历数组打Log)
效果:
Log部分
RxJava自带了2个快捷创建事件队列的方法 from() just()前者可传入一个数组,后者可以传入多个参数然后跑一个call()的回调。
代码如下:
Observable.just(1, 3, 4, 5, 6).subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
LogUtils.d("自动计算到 " + integer);
}
});
String aa[]={"1","2","3","4","5"};
Observable btn2Observable= Observable.from(aa);
btn2Observable.subscribe(new Action1() {
@Override
public void call(Object o) {
LogUtils.d("自动计算到 " + o);
}
});
像这边的行为类似于我们的 for循环然后每一个循环里println一个数,那么问题来了,这代码量看上去还比for长一点,有什么优势?
卖个关子我们看第二个例子
效果图中我们的按钮的字在不断的被刷新,类似的效果可以用Handler或者是RunOnUiThread(好像大小写有拼错,懒得查了理解就好)实现,那又为什么用RxJava呢? 看代码说话
在类里面声明了我们的观察者和被观察者,被观察者进行着我们的业务逻辑,观察者做监听。
Observable.just(1, 3, 4, 5, 6).subscribeOn(Schedulers.newThread()).subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
LogUtils.d("自动计算到 " + integer);
}
});
String aa[] = {"1", "2", "3", "4", "5"};
Observable btn2Observable = Observable.from(aa);
btn2Observable.subscribeOn(Schedulers.newThread()).subscribe(new Action1() {
@Override
public void call(Object o) {
LogUtils.d("自动计算到 " + o);
}
});
这里看完观众们又要问了,这代码量也没少啊,RxJava优势在哪?
那我们再贴一段
btn1Observable.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(btn1Oserver);
在我们的btn1的click行为里我们做了这么个操作,子线程执行逻辑内容,主线程刷UI。
优势在哪:
1.所有的行为都有相应的回调,而不用我们人工去申明额外的回调函数
2.异步,异步,异步!!!重要的事情说三遍
无论你的程序逻辑变得多么的复杂,代码构造依然整洁明了。
那既然提到了异步的内容,这边来说一下负责线程操作的类Scheduler
默认情况下哪走了subscribe()哪个线程就要干这件事
来例举下可用的一些工作状态
.immediate() :默认状态,哪用算哪
.newThread(): 开新线程做这件事
.io(): 跟newThread()差不多,不过在线程池大小上有差异,他是无限大
.computation():跟创建固定的线程池操作
.mainThread():在主线程做事
那既然说到了线程内容,再补充下如何设置线程
subscribeOn(): subscribe() 所发生的线程,也就是干活的线程
observeOn(): Subscriber 所运行在的线程,也就是的回调发生的线程
在例子中我有打出具体的线程ID,我们来看一下
主线程的
03-28 16:08:30.878 8717-8717/sample.wjj.rxandroidglidedemo D/LogUtils-MainActivity.onCreate(MainActivity.java:129): --->Main Thread id 1
工作线程的
03-28 16:46:20.358 8717-6259/sample.wjj.rxandroidglidedemo D/LogUtils-MainActivity$3.call(MainActivity.java:91): 子线程id 3489
也就应正了这一点,我们可以决定我们要做的操作在哪执行,反复强调,异步!!!!让主线程尽量少干活(或者说,让他干他应该干的活)
源码地址:https://github.com/ddwhan0123/RxAndroidDemo