RxJava作为Android项目中的事件总线 - 从总线中删除事件

时间:2016-06-06 06:43:00

标签: android rx-java rx-android

之前我曾经使用过EventBus,它易于使用且易于理解。但是,这一次,我想尝试使用RxJava进行类似事件总线的通信,但是不清楚如何从RxJava中删除事件,或者更好的说,它应该如何正确设计以具有与EventBus类似的行为当我打电话给private void insertDummyContactWrapper(String mStringPhoneContactName, String mStringPhoneContactNumber) { boolean hasWriteContactsPermission = ActivityCompat.shouldShowRequestPermissionRationale(this, android.Manifest.permission.WRITE_CONTACTS); if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_CONTACTS) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(SwipableHomeActivity.this, new String[]{android.Manifest.permission.WRITE_CONTACTS}, CONSTANTS.MY_PERMISSIONS_REQUEST_WRITE_CONTACTS); return; } //Insert Contact } 时?

在RxJava中,即使我订阅了这个observable,我也可以使用BehaviorSubject来回复,但是当处理这个事件时我该怎么办?如果我不想让这个事件再次播放怎么办?

例如,一个片段触发一个事件然后结束。另一个片段侦听此事件并处理它。然后,如果这个应用程序触发了另一个"另一个"从不同的情况再次活动,然后它将再次订阅相同的BehaviorSubject,并将再次处理该陈旧事件,这不是我想要实现的。

我将此项目用作参考https://github.com/marwinxxii/AndroidRxSamples/blob/master/app/src/main/java/com/github/marwinxxii/rxsamples/EventBusSampleActivity.java

1 个答案:

答案 0 :(得分:6)

只要您不打算允许events成为null,我认为这很容易实现。

正如您所说,您可以使用BehaviorSubject来传播sticky个事件,当您想要removeStickyEvent bus时,您可以发出null 1}} object(to" flush" subject)。

像这样的东西(从头顶开始 - 没有测试,没有泛型,只是一个简单的Object - 基于事件的例子):

public class RxEventBus {

    PublishSubject<Object> eventsSubject = PublishSubject.create();
    BehaviorSubject<Object> stickyEventsSubject = BehaviorSubject.create();

    public RxEventBus() {
    }

    public Observable<Object> asObservable() {
        return eventsSubject;
    }

    public Observable<Object> asStickyObservable() {
        return stickyEventsSubject.filter(new Func1<Object, Boolean>() {
            @Override
            public Boolean call(Object o) {
                return o != null;
            }
        });
    }

    public void postEvent(@NonNull Object event) {
        eventsSubject.onNext(event);
    }

    public void postStickyEvent(@NonNull Object stickyEvent) {
        stickyEventsSubject.onNext(stickyEvent);
    }

    public void removeStickyEvent(){
        stickyEventsSubject.onNext(null);
    }
}