RxJava事件总线

时间:2017-05-03 13:48:11

标签: android rx-java rx-android rx-java2

使用第一版RxJavaRxAndroid我跟class作为EventBus

public class RxBus {
private static RxBus instance;
private PublishSubject<Object> subject = PublishSubject.create();

public static RxBus instanceOf() {
    if (instance == null) {
        instance = new RxBus();
    }
    return instance;
}

public void setMessage(Object object) {
    subject.onNext(object);
}

public Observable<Object> getEvents() {
    return subject;
}
}

通过instanceOf在任何类中获取实例我使用setMessage方法发出消息并使用代码来获取发出的消息:

  bus.getEvents().subscribe(new Action1<Object>() {
        @Override
        public void call(Object o) {
            if (o instanceof String) {
                //TODO
            }
        }
    });

Action1来自rx.functions个套餐。尝试迁移使用RxJava 2我无法导入它。

请告诉我,使用RxJava 2作为EventBus

的最短方法是什么?

2 个答案:

答案 0 :(得分:6)

在RxJava2中,Action1已重命名为Consumer

  

其余的操作接口是根据Java 8功能类型命名的。无参数Action0将替换为运算符的io.reactivex.functions.Actionjava.lang.Runnable方法的SchedulerAction1已重命名为ConsumerAction2被称为BiConsumerActionNConsumer<Object[]>类型声明替换。

请参阅What's different in 2.0

答案 1 :(得分:0)

这是RxJava2中事件总线的一个很好的实现(代码是从这个gist复制的)

import io.reactivex.Observable;
import io.reactivex.subjects.PublishSubject;

public class RxBus {
    private static volatile RxBus sRxBus = null;
    private PublishSubject<Object> mPublishSubject = PublishSubject.create();

    private RxBus() {
    }

    public static RxBus getInstance() {
        if (sRxBus == null) {
            synchronized (RxBus.class) {
                if (sRxBus == null) {
                    sRxBus = new RxBus();
                }
            }
        }
        return sRxBus;
    }

    public <T> Observable<T> subscribe(Class<T> cls) {
        return mPublishSubject
                .filter(o -> o.getClass().equals(cls))
                .map(o -> (T) o);
    }

    public void post(Object obj) {
        mPublishSubject.onNext(obj);
    }
}