您的位置:首页 > 移动开发 > Android开发

初涉RxAndroid .from() .just() 以及线程操作

2016-03-28 16:47 429 查看

转载请注明出处:王亟亟的大牛之路

上一篇,整了个利用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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: