Android 进阶之路——RxJava

前几天一直听几个朋友们说起RxJava多好用,无奈实在不知道那是个啥,干嘛用的。这几天公司闲下来了也抓紧恶补了一波,留点学习笔记也好自己回过头来看看。

跟AsyncTask / Handler差不多,RxJava也是做异步处理的,但是为什么放这AsyncTask / Handler不用来用这个呢,技术的更新换代必定有它的道理,学过之后就知道了。

先说一下原理吧

这里有两个对象 一个是Observable,另一个是Observer,顾名思义这两个一个是观察者一个是被观察者,他们两个通过Subscribe产生订阅关系。既当被观察者操作一些耗时操作,当结束时他会告诉观察者“我做完了”,并把他处理的结果交给观察者,然后观察者再决定把这些结果怎么处置,当然还需要我们手动指定观察者与被观察者的操作在哪个线程执行。

好,了解了原理我们再来看看怎么使用,我们就实现把drawable里面的图片显示在ui界面上吧

先导入Rx包

compile'io.reactivex:rxjava:1.1.0'//Rx的包

compile'io.reactivex:rxandroid:1.1.0'//Rx的包

把我们要用的图片拷贝在drawable目录下并定义好imageview(不啰嗦);

Image Viewim;

int[] img={R.drawable.dog1,R.drawable.dog2,R.drawable.dog3,R.drawable.dog4};

先定义Observable,定义Observable的方法有好几种,像create(),just(),from().

create():基本的创造事件序列的方法。

just():将传入的参数依次发送出来。

from():将传入的数组拆分成具体对象后,依次发送出来。

Observable.create(newObservable.OnSubscribe() {//这里的Integer指的是创建好这个对象onNext往下传递的对象

@Override

public voidcall(Subscriber subscriber) {

for(int i:img){

try{

Thread.sleep(500); //这里延迟5ms是想 实现一个幻灯片效果

subscriber.onNext(i);//这里onNext方法会把里面携带的参数交给观察者来处理,这里是一个 int 值

}catch(InterruptedException e) {

e.printStackTrace();

}

}

subscriber.onCompleted();//一直给观察者传递消息,当停止传递消息时执行此方法

}

})

这里可以看到onNext传下去的是一个int值,但是我们的ui更新需要在主线程中进行,要是把提取图片之类的操作放在ui线程显然是不明智的,所以我们这里就需要一个map来进行转换

.map(new Func1() {

@Override

public Drawable call(Integer int) {//这个地方的int就是从被观察者那里通过onNext传下来的int值,而Drawable就是要继续往下传递的对象

Drawable drawable = getResources().getDrawable(int);

return drawable;//这里把取出来的Drawable继续往下传递

}

})

然后我们就需要来创建我们的观察者接收上面传过来的Drawable并且显示在ui界面上

new Observer() {

@Override

public void onCompleted() {//当接受结束时调用这个方法,前面说过

}

@Override

public void onError(Throwable e) {//当发生错误时调用这个方法

}

@Override

public void onNext(Drawable drawable) {//这里接收到的drawable就是上面传过来的

im.setImageDrawable(drawable);

}


现在我们已经创建好观察者、被观察者,并且把数据转换成了想要的形式,但是要通过什么方式才能使他们两个联系在一起呢,这里就用到了Subscribe

使用形式是这样的:

Observable.subscribe(Observable);

好,上完整代码

Observable.create(new Observable.OnSubscribe() {//这里的Integer指的是创建好这个对象onNext往下传递的对象            

@Override           

 public void call(Subscribersubscriber) {

                for(int i:img){

                    try {

                        Thread.sleep(500);

                        subscriber.onNext(i);

                    } catch (InterruptedException e) { 

                       e.printStackTrace();

                    } 

               } 

               subscriber.onCompleted();

            } 

       }).subscribeOn(Schedulers.io()//指定操作在哪个线程来执行

        .observeOn(Schedulers.io())//指定操作在哪个线程来执行

        .map(new Func1() {

                    @Override

                    public Drawable call(Integer ints) {

                        Drawable drawable = getResources().getDrawable(ints);

                        return drawable;

                    }

       }) 

              .observeOn(AndroidSchedulers.mainThread())//指定操作在哪个线程来执行

                .subscribe(new Observer() {

@Override

public void onCompleted() {

}

@Override

public void onError(Throwable e) {

}

@Override

public void onNext(Drawable drawable) {

im.setImageDrawable(drawable);

}

});


怎么突然冒出个这个:

.subscribeOn(Schedulers.io()//指定操作在哪个线程来执行

.observeOn(Schedulers.io())//指定操作在哪个线程来执行

上面咱也说过,他们的操作需要我们来指定在哪个线程来执行

subscribeOn(): 指定 subscribe() 所发生的线程,即 Observable.OnSubscribe 被激活时所处的线程。或者叫做事件产生的线程。换成人话就是说当被观察者执行onNext操作时执行线程,通常用在被观察者创建好的下一行代码。

observeOn(): 指定 Observer所运行在的线程。或者叫做事件消费的线程。就是观察者拿到了数据后我该执行的操作的线程。

好了到这里就能得到我们想要的结果了,但是这只是RxJava的九牛一毛,他的用法还有很多很多,这篇文章能教大家的不多希望能带你们入门。



示例图
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容