RxJava简单使用

RxJava的作用

这里引用github上的说明

RxJava – Reactive Extensions for the JVM – a library for composing asynchronous and event-based programs using observable sequences for the Java VM.

RxJava是基于观察者模式

  1. 简单的说一下什么是观察者模式
    Observable==>被观察者
    Observer ==> 观察者
    subscribe ==> 订阅关系

观察者模式需要理解的是,其实并不是观察者一直在观察着被观察者,然后发现被观察者的动作.
事实上是被观察者对象发生了任何动作之后,通过接口反馈给观察者.
这跟订报纸很相像: 订报纸的人(观察者) 花了100块订阅(订阅关系)了报社(被观察者)一年的报纸.
然后那,报社每次有新报纸了之后,主动给订报纸的人把报纸送过去.这就是一个简单的观察者模式.

报社

    /**
     * 这里假设被观察者是报社
     */
    public class 报社 {
    
        private List<订阅关系> 订阅组 = new ArrayList<>();
    
        public void 订阅报纸(订阅关系 订阅关系){
            订阅组.add(订阅关系);
        }
    
        public void 有新版报纸了(){
            for (订阅关系 订阅关系 : 订阅组) {
                订阅关系.送报纸();
            }
        }
    }

订报纸的人A

    /**
     * 这里是订阅报纸的人A
     */
    public class 订报纸的人A implements 订阅关系 {
    
        private String TAG = "订报纸的人A";
    
        @Override
        public void 送报纸() {
            Log.e(TAG, "收到新版报纸: ");
        }
    
    }

订报纸的人B

    /**
     * 这里是订阅报纸的人B
     */
    public class 订报纸的人B implements 订阅关系 {
    
        private String TAG = "订报纸的人B";
    
        @Override
        public void 送报纸() {
            Log.e(TAG, "收到新版报纸: ");
        }
    }

订阅关系

    /**
     * 花100块/年在报社定订阅报纸
     */
    public interface 订阅关系 {
        void 送报纸();
    }

订阅报纸

    var 订报纸的人A = 订报纸的人A()
    var 订报纸的人B = 订报纸的人B()

    val 报社 = 报社()
    报社.订阅报纸(订报纸的人A)
    报社.订阅报纸(订报纸的人B)
    
    报社.有新版报纸了()
打印结果.png

RxJava的简单使用

  1. 创建被观察者对象

     //被观察者
     Observable observable=Observable.create(new ObservableOnSubscribe<String>() {
         @Override
         public void subscribe(ObservableEmitter<String> emitter) throws Exception {
             emitter.onNext("第一周的报纸");
             emitter.onNext("第二周的报纸");
             emitter.onNext("第三周的报纸");
             emitter.onComplete();
         }
     });
    
  • Observable==>被观察者;
  • ObservableOnSubscribe<T> 这里可以理解为计划表;
  • 重写subscribe方法,里边是计划表的具体内容;
  • ObservableEmitter<String>对象的Emitter是发射器的意思;
  • ObservableEmitter有三种发射的方法,分别是onNext、onError、onComplete()
  • onNext方法可以无限调用,表示下一个发射的意思.
  • onComplete可以重复调用,但是Observer(观察者)只会接收一次,接收到既结束;
  • onError不可以重复调用,在事件处理过程中出异常时,onError() 会被触发.
  • onCompleted() 和 onError() 二者是互斥的,Observer(观察者)只能接收到一个.
  1. 创建观察者对象

     //观察者
     Observer<String> observer=new Observer<String>() {
         @Override
         public void onSubscribe(Disposable d) {
             mDisposable=d;
             Log.e(TAG,"onSubscribe");
         }
    
         @Override
         public void onNext(String value) {
             if ("第二周的报纸".equals(value)){
                 mDisposable.dispose();
                 return;
             }
             Log.e(TAG,"onNext:"+value);
         }
    
         @Override
         public void onError(Throwable e) {
             Log.e(TAG,"onError="+e.getMessage());
         }
    
         @Override
         public void onComplete() {
             Log.e(TAG,"onComplete()");
         }
     };
    
  • onSubscribe 当订阅成功的时候会调用
  • onNext对应的Observable onNext方法(),Observable 中调用几次,不出意外这里就会接收到几次.
  • onComplete订阅时间完成,这里只能接收到一次.结束本次订阅.
  • onError出现异常时调用.结束本次订阅.
  • Disposable 有两个方法 mDisposable.dispose() mDisposable.isDisposed
    1. dispose()主动解除订阅
    2. isDisposed():查询是否解除订阅 true 代表 已经解除订阅

RxJava如不及时取消订阅,当Activity或者Fragment销毁的时候可能会造成内存泄漏.
取消订阅之后,将不会在接受到后续的onNext事件.

  1. 建立订阅关系

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