如何将事件放入ReactiveX Observable?

时间:2017-01-23 19:55:14

标签: java listener rx-java reactivex

我有一个事件回调方法

public void onSomethingHappened(Information info) {

由一些传统的事件发行者调用。

现在我想把它包装成ReactiveX observable。

怎么做?

更新

我找到了PublishSubject<T>类,并通过以下方式使用它来从Android API中包装LocationListener

public class LocationPublisher implements LocationListener {


    @Override
    public void onLocationChanged(Location location) {
        LocationPublisher.onNext(location);
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        StatusPublisher.onNext( new BundleEx(provider, status, extras) );
    }

    @Override
    public void onProviderEnabled(String provider) {
        EnablenessPublisher.onNext(new Enableness(provider, true));
    }

    @Override
    public void onProviderDisabled(String provider) {
        EnablenessPublisher.onNext(new Enableness(provider, false));
    }

    public final PublishSubject<Location> LocationPublisher = PublishSubject.create();

    public final PublishSubject<BundleEx> StatusPublisher = PublishSubject.create();

    public final PublishSubject<Enableness> EnablenessPublisher = PublishSubject.create();


    public static class Enableness {

        private final String provider;

        private final boolean enabled;


        public Enableness(String provider, boolean enabled) {
            this.provider = provider;
            this.enabled = enabled;
        }

        public String getProvider() {
            return provider;
        }

        public boolean isEnabled() {
            return enabled;
        }
    }


    public static class BundleEx {

        private final String provider;

        private final int status;

        private final Bundle extras;

        public BundleEx(String provider, int status, Bundle extras) {
            this.provider = provider;
            this.status = status;
            this.extras = extras;
        }

        public String getProvider() {
            return provider;
        }

        public int getStatus() {
            return status;
        }

        public Bundle getExtras() {
            return extras;
        }
    }
}

这是正确的做法吗?现在我可以订阅LocationPublisherStatusPublisherEnablenessPublisher我?

1 个答案:

答案 0 :(得分:0)

您可以将这些事件的来源视为概念可观察对象,并且侦听器是概念用户。

最大的不匹配是你有无限的事件来源,即它不会自己终止。并不是说非法或不可能处理,但对RX来说并不自然。

所以你使用Observable.create()。 OnSubscribe是将侦听器添加到此传统源的操作,同时实现一个调用订阅者onNext()的侦听器。

// final EventSource source = ...

Observable.create(s -> {
  source.addFooBarListener(info -> { //could be a full anon innerclass too if more than 1 method
    s.onNext(info);
  });
});

我靠记忆,我手边没有编译器也没有api。抱歉。 当然,缺少代码行来执行正确的onComplete()/ onError()。