RxBus学习

学习资料

1. RxJava1.0版本使用

RxJava 2.0版本与1.0有些不同

1.1 RxBus简单实现

主要用于发送接收

public class RxBus {
    private final Subject<Object, Object> bus;
    private static RxBus defaultRxBus;

    private RxBus() {
        bus = new SerializedSubject<>(PublishSubject.create());
    }

    public static RxBus getInstance() {
        if (null == defaultRxBus) {
            synchronized (RxBus.class) {
                if (null == defaultRxBus) {
                    defaultRxBus = new RxBus();
                }
            }
        }
        return defaultRxBus;
    }
    /*
     * 发送
     */
    public void post(Object o) {
        bus.onNext(o);
    }
    /*
     * 是否有Observable订阅
     */
    public boolean hasObservable() {
        return bus.hasObservers();
    }
    /*
     * 转换为特定类型的Obserbale
     */
    public <T> Observable<T> toObservable(Class<T> type) {
        return bus.ofType(type);
    }
}

post()方法就是使用onNext(Object o)方法,将Event对象发送出去

toObservable(Class<T> type),转换为特定类型的Obserbale。方法内使用了ofType操作符,ofType源码内就是filter + cast的组合,只发送特定的类型。fliter用来判断是否为指定的类型,cast将一个Observable转换为指定的特殊Observable


1.2 Activity中使用

最简单的使用,只是为了使用而使用,没有考虑任何场景

public class RxBusActivity extends AppCompatActivity {
    private CompositeSubscription mCom;
    private TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_rx_bus);
        initView();
    }

    private void initView() {
        tv = (TextView) findViewById(R.id.rxbus_activity_tv);
        Button button = (Button) findViewById(R.id.rxbus_activity_send);
        //点击发送事件
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                RxBus.getInstance().post(new Event("RxBus Info!!!"));
            }
        });
        //接收
        mCom = new CompositeSubscription();
        //Event 类型的 Observable 订阅
        Subscription subscription = RxBus.getInstance().toObservable(Event.class).subscribe(new Action1<Event>() {
            @Override
            public void call(Event event) {
                tv.setText(event.info);
            }
        });
        //将 Subscription 添加进 CompositeSubscription中
        mCom.add(subscription);    }

    class Event {
        String info;

        Event(String info) {
            this.info = info;
        }
    }
//    @Override
//    protected void onDestroy() {
//        super.onDestroy();
//        if (null != mCom && !mCom.isUnsubscribed()) {
//           mCom.unsubscribe();
//        }
//    }

}

Activity中有一个Button,点击Button后发送一个携带字符串RxBus Info!!!Event对象

CompositeSubscription看作是用来收集Subscription容器,内部有一个new HashSet<Subscription>(4)


1.2.1 未取消订阅发生内存泄漏

当成功接收到字符串信息后,点击返回键,关闭当前使用了RxBus接收EventActivity,过了5秒钟左右,使用的LeakCanary,便给出了内存泄漏信息

未取消订阅,内存泄漏

原因:未取消订阅

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (null != mCom && !mCom.isUnsubscribed()) {
           mCom.unsubscribe();
        }
    }

记得在onDestory()取消订阅,CompositeSubscription会将内部所有的Subscription取消订阅


1.3 认识车零件

RxBus中涉及到3个重要零件

  • Subject

桥梁或者代理;既是Observable又是Observer。作为一个Observer,可以被一个或多个Observable进行subscribe订阅;作为一个Observable,可以转发收到(Observe)的数据,也可以发射新的数据


  • SerializedSubject

Subject 当作一个 Subscriber 使用时,注意不要从多个线程中调用它的onNext()方法,也包括其它的onXX()系列方法。这可能导致同时(非顺序)调用,这会违反Observable协议,给Subject的结果增加了不确定性。需要将Subscriber转换为一个SerializedSubject

mySafeSubject = new SerializedSubject( myUnsafeSubject )

  • PublishSubject

只会把在订阅发生的时间点之后来自原始Observable的数据发送给Observer

PublishSubject可能会一创建完成,就开始发送数据。这可能会导致在Subject被创建到有观察者订阅它之前这个时间段内,有数据丢失。为了确保原始Observable的所有数据都被分发,可以使用PublishSubject.create(),以便手动给它引入冷Observable的行为,也就是当所有观察者都已经订阅时才开始发射数据


2. RxJava2.0版本

2.0版本的RxBus有些改动,但代码实现思路应该还是一样的。

RxJava1.0都只是了解一些基础,2.0更不了解,需要再学习很长一段时间

2.1 RxBus2

代码:

public class RxBus2 {
    private static RxBus2 defaultRxBus;
    private Subject<Object> bus;

    private RxBus2() {
        bus = PublishSubject.create().toSerialized();
    }

    public static RxBus2 getInstance() {
        if (null == defaultRxBus) {
            synchronized (RxBus2.class) {
                if (null == defaultRxBus) {
                    defaultRxBus = new RxBus2();
                }
            }
        }
        return defaultRxBus;
    }

    public void post(Object o){
        bus.onNext(o);
    }

    public boolean hasObservable() {
        return bus.hasObservers();
    }
    /*
     * 转换为特定类型的Obserbale
     */
    public <T> Observable<T> toObservable(Class<T> type) {
        return bus.ofType(type);
    }
}

SerializedSubject不再通过直接new的方式,而是使用PublishSubject.create().toSerialized()的方式


2.2 Activity使用

代码:

public class RxBus2Activity extends AppCompatActivity {
    private TextView textView;
    private CompositeDisposable compositeDisposable;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_rx_bus2);
        initView();
    }

    private void initView() {
        textView = (TextView) findViewById(R.id.rx_activity_tv);
        Button button = (Button) findViewById(R.id.rx_activity_bt);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                RxBus2.getInstance().post(new Event("RxBus2 Info!!!"));
            }
        });
        compositeDisposable = new CompositeDisposable();
        RxBus2.getInstance().toObservable(Event.class).subscribe(new Observer<Event>() {
            @Override
            public void onSubscribe(Disposable d) {
                compositeDisposable.add(d);
            }

            @Override
            public void onNext(Event event) {
                textView.setText(event.info);
            }

            @Override
            public void onError(Throwable e) {
                textView.setText(e.getMessage());
            }

            @Override
            public void onComplete() {

            }
        });
    }

    class Event {
        String info;

        Event(String info) {
            this.info = info;
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (null != compositeDisposable && !compositeDisposable.isDisposed()) {
            compositeDisposable.clear();
        }
    }
}

subscribe()订阅方法返回值为void,不再是Subscription。而取消订阅的控制权则交给了
onSubscribe(Disposable d)方法中的Disposable。使用CompositeDisposable可以将所有的订阅关系清除


3. 最后

过完年,第一篇博客,哈哈。看到朋友圈都在晒2017第一个工作日,作为一个没有找到工作的人,表示各种羡慕

有错误,请指出

共勉 :)

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

推荐阅读更多精彩内容