just()不适用于订阅和flatmap()

时间:2015-11-10 08:35:28

标签: rx-java

我们的想法是订阅

订阅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

1 个答案:

答案 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