(译)将Listener转换成Observable

在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

阅读原文

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,641评论 25 708
  • 我从去年开始使用 RxJava ,到现在一年多了。今年加入了 Flipboard 后,看到 Flipboard 的...
    Jason_andy阅读 5,601评论 7 62
  • 前言我从去年开始使用 RxJava ,到现在一年多了。今年加入了 Flipboard 后,看到 Flipboard...
    占导zqq阅读 9,204评论 6 151
  • 工作,避免压力过大的方式是设立阶段性目标,分化成最小单位,每天去执行,执行是打败平庸的最好方式,过程中拒绝角色的超...
    混儿姐阅读 1,905评论 0 50
  • 2016-11-04 华杉 “茅塞顿开”成语出处。孟子的原意,不是茅塞顿开,是茅塞不开。 【孟子谓高子曰:“山径之...
    郁萍阅读 294评论 0 0