(译)将Listener转换成Observable

作者: 程序亦非猿 | 来源:发表于2015-09-14 17:53 被阅读981次

    在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

    阅读原文

    相关文章

      网友评论

        本文标题:(译)将Listener转换成Observable

        本文链接:https://www.haomeiwen.com/subject/axqmcttx.html