RxJava实现事件总线——RxBus
来源:互联网 发布:收购淘宝店铺有什么用 编辑:程序博客网 时间:2024/06/02 20:56
事件总线的好处在于方便组件之间的交互,RxBus不是一个库,而是使用RxJava实现事件总线的一种思想。首先介绍一下RxJava与事件总线的不同之处。
- RxJava使用的是Observable-Observer模式
- 事件总线使用的是Publisher-Subscriber模式
两者都是使用观察者模式,但存在一点区别,Publisher-Subscriber模式的发布者(Publisher,Observable)关心的是事件的发出,并不想知道事件的订阅者(Subscriber,Observer)是谁。观察者模式通常会借助于一个中间人,这个中间者即事件总线(EventBus,Otto),在此用RxJava创建中间人RxBus来实现事件总线。
事件总线
package com.android.buttondemo;import rx.Observable;import rx.subjects.PublishSubject;import rx.subjects.SerializedSubject;import rx.subjects.Subject;/** * 事件总线 */public class RxBus { public static RxBus rxBus = null; public static RxBus getInstance(){ if(rxBus == null){ rxBus = new RxBus(); } return rxBus; } private final Subject<Object,Object> bus = new SerializedSubject<>(PublishSubject.create()); /** * * 发送消息 */ public void send(Object o){ bus.onNext(o); } /** * * 接受消息 */ public Observable<Object> toObservable(){ return bus; } /** * * 查看是否有订阅者 */ public boolean hasObserver(){ return bus.hasObservers(); }}
- Subject充当中间人,因为它既做Observable,也做Observer,但是它不是线程安全的,需要用SerializedSubject包装,让其线程安全
- PublishSubject只会在事件订阅发生之后把来自原始Observable中的数据发送给订阅者
发布者
package com.android.buttondemo;import android.content.Intent;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;public class PublisherActivity extends AppCompatActivity { private Button send; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.publisher_activiy); RxBus bus = RxBus.getInstance(); //Log.d("TAG",String.valueOf(bus.hasObserver())); bus.send("Message"); send = (Button) findViewById(R.id.send_button); send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(PublisherActivity.this,SubscriberActivity.class); startActivity(intent); finish(); } }); }}
订阅者
package com.android.buttondemo;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.widget.TextView;import rx.Subscription;import rx.android.schedulers.AndroidSchedulers;import rx.functions.Action1;public class SubscriberActivity extends Activity { private TextView content; private Subscription subscription; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.subscriber_activity); content = (TextView) findViewById(R.id.content_textView); RxBus bus = RxBus.getInstance(); subscription = bus.toObservable() .subscribeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<Object>() { @Override public void call(Object o) { Log.d("Thread",Thread.currentThread().getName()); } }); } /** * 取消订阅 */ @Override protected void onDestroy() { super.onDestroy(); if(subscription.isUnsubscribed()){ subscription.unsubscribe(); } }}
一定记得要取消事件订阅,防止RxJava引起的内存泄漏
0 0
- RxJava实现事件总线——RxBus
- RxJava实现事件总线(RxBus)及详解
- 使用RxJava实现的超简单事件总线RxBus
- 用RxJava实现Rxbus替换EventBus事件总线
- Rxbus实现事件总线
- RxBus事件总线的实现
- RxBus事件总线的实现
- Android Rxbus事件总线
- 基于RxJava实现事件总线
- RxBus----Rxjava实现EventBus
- 用RxJava实现RxBus
- Android RxJava 实现RxBus
- Rxjava——使用RxBus替换EventBus
- 用RxJava实现事件总线(Event Bus)
- 用RxJava实现事件总线(Event Bus)
- 用RxJava实现事件总线(Event Bus)
- 用RxJava实现事件总线(Event Bus)
- 用RxJava实现事件总线(Event Bus)
- 文章标题
- keepalived
- 从0开始一步一步用Laravel5.2集成原生微信支付
- 某些批处理学习
- 异地多个局域网间实现直接访问,不同局域网互访
- RxJava实现事件总线——RxBus
- 2016夏季练习——LCA
- 希尔排序算法
- oracle表锁定与解锁
- Intent,Action,大全[转]
- 使用终端命令查看数据库中的索引
- 怎样制作开机动画
- Android学习笔记之AndroidManifest.xml文件解析
- 在线Logcat格式化及log过滤工具