原文出处:http://www.jianshu.com/p/a3340cb2103b
在Java中使用listeners很常见.并且如果你使用RxJava,你会更乐意使用Observable替代listeners.
但是如果你不得不处理一个你不能修改源代码的库呢?
这里有一个简单的方法去创建一个围绕listener的Observable.
假设我们有个一接口ValueUpdateListener
并且一个对象ValueUpdater
将会调用我们的listener:
public interface ValueUpdateListener { void onValueChanged(@NonNull String value); } public class ValueUpdater { // in some point of the class... public void registerListener(ValueUpdateListener listener) { //... }; public void unregisterListener(ValueUpdateListener listener) { //... }; }
我们可以创建一个Observable像这样:
译者注:这里有些地方缺少了final
关键字.
public Observable<String> observableListenerWrapper() { return Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { ValueUpdateListener listener = new ValueUpdateListener() { @Override public void onValueChanged(@NonNull String value) { if (subscriber.isUnsubscribed()) { registerListener.unregisterListener(this); } else { subscriber.onNext(value); } } }; registerListener.registerListener(listener); } }); }
现在我们只需要去订阅:
observableListenerWrapper().subscribe(value -> { // do something with the new value });
注意这个监听将会自动注销如果onValueChanged
被调用并且这个observable取消订阅.
译者注:
其实有时候不需要ValueUpdater
,更加简单,更多代码可以查看我的PracticeDemo
阅读原文