在多个订阅者之间共享 RxBindings Observable 事件
Sharing RxBindings Observable events between multiple subscribers
我正在使用 RxBindings 库中的 Focus Observable 来对焦点变化做出反应。因为我想验证输入并触发动画,所以我需要两次焦点事件。 Jake Wharton 建议使用 share() 运算符对一个可观察对象进行多个订阅。但是如果我在使用 share() 之后操作可观察对象,第一个订阅就死了。
这是我的用例的一个小例子
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
所以看起来第二种情况的操纵覆盖了第一种情况。
我做错了什么以及在多个订阅者之间以不同方式操作时共享事件的预期方式是什么
谢谢
RxView.focusChanges() Observable 会在每次订阅时在 View 上设置新的 OnFocusChangeListener,因此之前的监听器将没有接到任何新电话。
在您的代码中您有两个订阅 - 第一个直接在 focusChangeObservable 上,第二个是 share operator
通过 share 运算符将您的 Observable 变成 ConnectableObservable 是个好主意,尽管您需要订阅每个 share 返回的 Observable时间 f.e :
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);
});
我正在使用 RxBindings 库中的 Focus Observable 来对焦点变化做出反应。因为我想验证输入并触发动画,所以我需要两次焦点事件。 Jake Wharton 建议使用 share() 运算符对一个可观察对象进行多个订阅。但是如果我在使用 share() 之后操作可观察对象,第一个订阅就死了。
这是我的用例的一个小例子
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
所以看起来第二种情况的操纵覆盖了第一种情况。 我做错了什么以及在多个订阅者之间以不同方式操作时共享事件的预期方式是什么
谢谢
RxView.focusChanges() Observable 会在每次订阅时在 View 上设置新的 OnFocusChangeListener,因此之前的监听器将没有接到任何新电话。
在您的代码中您有两个订阅 - 第一个直接在 focusChangeObservable 上,第二个是 share operator
通过 share 运算符将您的 Observable 变成 ConnectableObservable 是个好主意,尽管您需要订阅每个 share 返回的 Observable时间 f.e :
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);
});