我们的想法是订阅
订阅sbscribe到订阅,当他们获得一个值时,他们会自动取消订阅。
但有些人,为什么没有调用onComplete(),订阅者继续收到消息。
测试示例:
public class MyActivity extends Activity {
private final Subject<String, String> mStringSubject = new
SerializedSubject<>(PublishSubject.create());
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Handler h = new Handler();
h.postDelayed(() -> mStringSubject.onNext("Hello1"), 500);
h.postDelayed(() -> mStringSubject.onNext("Hello2"), 1000);
mStringSubject.flatMap(Observable::just)
.subscribe(s -> Log.e("MainActivity", s),
Throwable::printStackTrace,
() -> Log.e("MainActivity", "Completed"));
}
}
在日志中我看到了
Hello 1
Hello 2
但我希望:
Hello 1
Completed
答案 0 :(得分:1)
mStringSubject.flatMap(Observable::just)
没有取消订阅,因此订阅者会收到mStringSubject
发出的所有内容。如果您想确保每个订阅者只获得一个值,请将take(1)
应用于源:
Observable<String> o = mStringSubject.flatMap(Observable::just).take(1);
o.subscribe(...)
o.subscribe(...)
顺便说一下,mStringSubject.flatMap(Observable::just)
只是增加了开销,相当于mStringSubject
。