博主信息
博文 5
粉丝 0
评论 0
访问量 7835
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
Android项目常用之Rxbus的简单实现和使用
啃腿牛的博客
原创
3701人浏览过

前言

RxJava目前已经很火了,对于RxJava这里不多做介绍。
RxBus并不是一个库,而是一种模式。相信大多数开发者都使用过EventBus,作为事件总线通信库,如果你的项目已经加入RxJava和EventBus,不妨用RxBus代替EventBus,以减少库的依赖。

    一。添加Rxjava和RxAndroid依赖

        implementation 'io.reactivex:rxandroid:1.2.1'
        implementation 'io.reactivex:rxjava:1.1.6'

    二。新建Java类

private static volatile Rxbus mInstance;
        private final Subject bus;
        public Rxbus(){
                bus=new SerializedSubject<>(PublishSubject.create());
        }
    
        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;
    }
    /**
     * send message
     * @param obj
     */
    public void post(Object obj){
        bus.onNext(obj);
    }
    /**
     *  receive message
     * @param eventType
     * @param <T>
     * @return
     */
    public <T> Observable<T> toObserverable(Class<T> eventType){
        return bus.ofType(eventType);
    }

    tip:

      1、Subject同时充当了Observer和Observable的角色,Subject是非线程安全的,要避免该问题,需要将 Subject转        换 为 一个 SerializedSubject,上述RxBus类中把线程非安全的PublishSubject包装成线程安全的Subject。

      2、PublishSubject只会把在订阅发生的时间点之后来自原始Observable的数据发射给观察者。

      3、ofType操作符只发射指定类型的数据,其内部就是filter+cast

三。创建需要发送的事件类

    public class StudentEvent { 
    private String id;    
    private String name;    
    public StudentEvent(String id, String name) {        
        this.id = id;       
         this.name = name;
    
    }   
     public String getId() { 
          return id;
    
        }    
    public void setId(String id) {
            this.id = id;     
}   
     public String getName() {  
      return name;
    
}    
public void setName(String name) { 
       this.name = name;
  
  } 
}

四。发送事件:

Rxbus.getInstance().post(new StudentEvent("007","zndroid"));

五。接收事件:

 subscribe = Rxbus.getInstance().toObserverable(StudentEvent.class).subscribe(new Action1<StudentEvent>() {
        @Override
        public void call(StudentEvent studentEvent) {
            tv.setText("id:" + studentEvent.getId() + "  name:" + studentEvent.getName());
        }
    });

tip:

        subscription是Sbscription的对象,我们这里把RxBus.getInstance().toObserverable(StudentEvent.class)赋值给       sbscription以方便生命周期结束时取消订阅事件

六。取消订阅:

@Override
    protected void onDestroy() {
        if (!subscribe.isUnsubscribed()){
        subscribe.unsubscribe();
        }
        super.onDestroy();
    }

七。效果图:

dad.gif

参考:

http://wuxiaolong.me/2016/04/07/rxbus/
http://www.jianshu.com/p/ca090f6e2fe2

本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学