我有一个事件回调方法
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;
}
}
}
这是正确的做法吗?现在我可以订阅LocationPublisher
,StatusPublisher
和EnablenessPublisher
我?
答案 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()。