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
原创粉丝点击