共享RxBindings多个订阅者之间的可观察事件

时间:2016-01-25 07:49:59

标签: android publish-subscribe rx-java rx-android

我正在使用RxBindings库中的Focus Observable来对焦点变化做出反应。因为我要验证输入并触发动画,我需要两次焦点事件。 Jake Wharton建议在一个observable上使用share()运算符进行多个订阅。但是如果我在使用share()之后操纵observable,那么第一个订阅就会死掉。

这是我的用例

的一个小例子
public class ShareTest extends AppCompatActivity {

@Bind(R.id.editTextOne)
EditText editTextOne;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_share_test);

    ButterKnife.bind(this);

    Observable<Boolean> focusChangeObservable = RxView.focusChanges(editTextOne);
    focusChangeObservable.subscribe(focused -> Log.d("test","Subscriber One: "+focused));

    focusChangeObservable.share().skip(1).filter(focused -> focused == false).subscribe(focused -> {
        Log.d("test","Subscriber Two: "+focused);
    });
}
}

当我获得并且忽略了对EditText的关注时,我需要和期望的是输出

Focus gain
Subscriber One: true

Focus loss
Subscriber One: false
Subscriber Two: false

但实际上我得到的是

Focus gain

Focus loss
Subscriber Two: false

所以看来第二种情况的操纵优先于第一种情况。 我做错了什么,以及在多个订阅者被不同地操纵时在多个订阅者之间共享事件的预期方式

由于

1 个答案:

答案 0 :(得分:8)

每次订阅时,

RxView.focusChanges() Observable都会在View上设置新的 OnFocusChangeListener ,因此上一个侦听器不会接到任何新的调用。

在您的代码中,您有两个订阅 - 首先直接在 focusChangeObservable ,第二个是 share 运算符

通过 share 运算符将您的observable转换为ConnectableObservable是一个好主意,但每次f.e:

都需要订阅 share 返回的Observable。
    final Observable<Boolean> sharedFocusChangeObservable = focusChangeObservable.share();
    sharedFocusChangeObservable.subscribe(focused -> Log.d("test","Subscriber One: "+focused));
    sharedFocusChangeObservable.skip(1).filter(focused -> focused == false).subscribe(focused -> {
        Log.d("test","Subscriber Two: "+focused);
    });
相关问题