将Listener转换成Observable

泡在网上的日子 / 文 发表于2015-09-14 19:49 第次阅读 Observable,RxJava

原文出处: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

阅读原文

 

收藏 赞 (0) 踩 (1)
上一篇:Android Tips - 填坑手册
学习 Android 至今,大大小小的坑没少踩,庆幸的是,在强大的搜索引擎与无私奉献的人们的帮助下,我遇到的坑都顺利地被填平了。 为了便于日后遇到同样的问题时,能免于再次搜索带来的麻烦,我养成了收藏书签的习惯,随着书签(Tips)的日积月累,我想,是时
下一篇:三次贝塞尔曲线练习之弹性的圆
效果图 贝塞尔曲线知识讲解 效果图 开始本文之前先查看一下目标效果是如何的。 这个动画的来源是优秀网页设计的一个 微博 ,看到这个效果感觉下面的圆的动画十分的赞,于是就打算模仿这个效果。 然后接下来看我所做的简单效果吧。 项目代码: https://github