RxBus使用

作者: 奔跑吧李博 | 来源:发表于2018-12-27 10:47 被阅读0次

    Rxbus属于Rxjava库下一小部分功能,如果项目已经使用Rxjava,就不需要再额外引入EventBus库来使用了,直接使用Rxbus就可以了撒。需要从Eventbus转到Rxbus使用的童鞋可以放心转,使用方式大同小异。

    引入库:
        implementation 'io.reactivex:rxjava:1.1.0'
        implementation 'io.reactivex:rxandroid:1.1.0'
    
    创建Rxbus操作类:

    Subject是非线程安全的,在并发情况下,不推荐使用通常的Subject对象,而是推荐使用SerializedSubject。

    public class RxBus {
        private static volatile RxBus instance;
        private Subject<Object, Object> bus;
    
        private RxBus() {
            bus = new SerializedSubject<>(PublishSubject.create());
        }
    
        public static RxBus getDefault() {
            if (instance == null) {
                synchronized (RxBus.class) {
                    instance = new RxBus();
                }
            }
            return instance;
        }
    
        /**
         * 发送事件
         * @param object
         */
        public void post(Object object) {
            bus.onNext(object);
        }
    
        /**
         * 根据类型接收相应类型事件
         * @param eventType
         * @param <T>
         * @return
         */
        public <T> Observable toObservable(Class<T> eventType) {
            return bus.ofType(eventType);
        }
    }
    
    在BaseActivity中保存和取消订阅事件。
    public class BaseActivity extends AppCompatActivity {
        protected ArrayList<Subscription> rxBusList = new ArrayList<>();
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
    
            clearSubscription();
        }
    
        /**
         * 取消该页面所有订阅
         */
        private void clearSubscription() {
            for (Subscription subscription : rxBusList) {
                if (subscription != null && subscription.isUnsubscribed()) {
                    subscription.unsubscribe();
                }
            }
        }
    }
    
    发送的对象实体类:
    public class EventBean {
        private int userId;
        private String nickName;
    
        public EventBean(int userId, String nickName) {
            this.userId = userId;
            this.nickName = nickName;
        }
    
        public int getUserId() {
            return userId;
        }
    
        public void setUserId(int userId) {
            this.userId = userId;
        }
    
        public String getNickName() {
            return nickName;
        }
    
        public void setNickName(String nickName) {
            this.nickName = nickName;
        }
    }
    
    
    发送事件方式:
    RxBus.getDefault().post(new EventBean(1, "听说名字长回头率很高"));
    
    接收事件方式:
            Subscription subscription = RxBus.getDefault().toObservable(EventBean.class)
                .subscribe(new Action1<EventBean>() {
                @Override
                public void call(EventBean eventBean) {
                    tvContent.setText(eventBean.getUserId() + "------" + eventBean.getNickName());
                }
            });
            rxBusList.add(subscription);
    

    戳这里简单demo地址

    相关文章

      网友评论

        本文标题:RxBus使用

        本文链接:https://www.haomeiwen.com/subject/ypftcqtx.html