首页 > 学院 > 开发设计 > 正文

Rxbus实现事件总线

2019-11-06 10:04:47
字体:
来源:转载
供稿:网友

   RXjava在2016年大放异彩,如果大家已经在项目中使用了Rxjava,可以尝试用Rxbus来替代Eventbus(Rxbus也是基于观察者模式),这样就不需要再引入其他的依赖库了!

话不多说,我们直接上代码:

public class RxBus {    PRivate static volatile RxBus mInstance;    private final Subject bus;    public RxBus()    {        bus = new SerializedSubject<>(PublishSubject.create());    }    /**     * 单例模式RxBus     *     * @return     */    public static RxBus getInstance()    {        RxBus rxBus2 = mInstance;        if (mInstance == null)        {            synchronized (RxBus.class)            {                rxBus2 = mInstance;                if (mInstance == null)                {                    rxBus2 = new RxBus();                    mInstance = rxBus2;                }            }        }        return rxBus2;    }    /**     * 发送消息     *     * @param object     */    public void post(Object object) {bus.onNext(object);}    /**     * 接收消息     *     * @param eventType     * @param <T>     * @return     */    public <T> Observable<T> toObserverable(Class<T> eventType)    {        return bus.ofType(eventType);    }}定义一个单例的Rxbus类,确保线程的安全。

public class MainActivity extends AppCompatActivity {    private TextView tv;    private Subscription rxSbscription;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        tv = (TextView) findViewById(R.id.tv);        rxSbscription = RxBus.getInstance().toObserverable(StudentEvent.class)                .subscribe(new Action1<StudentEvent>() {                    @Override                    public void call(StudentEvent studentEvent) {                        tv.setText("id:" + studentEvent.getId() + "  name:" + studentEvent.getName());                    }                });        tv.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Intent it=new Intent();                it.setClass(MainActivity.this,MainActivity2.class);                startActivity(it);            }        });    }    @Override    protected void onDestroy() {        if (!rxSbscription.isUnsubscribed()){            rxSbscription.unsubscribe();        }        super.onDestroy();    }}在主Activity里面进行订阅,这里需要注意的是在Activity销毁的时候记得解绑哦!不然发生内存泄漏,这个锅我可不背!

public class MainActivity2 extends AppCompatActivity {    private TextView tv;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        tv = (TextView) findViewById(R.id.tv);        RxBus.getInstance().post(new StudentEvent("123","小明"));    }}在事件产生的源头执行post方法,Rxbus接收到消息以后会自动的把消息转发给订阅者!

到这里一个简单的Rxbus就实现啦!


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表