Rxjava combineLatest - 为什么只有一个主题发生变化时 BiFunction 被调用两次?

Rxjava combineLatest - why is BiFunction called twice when only one subject changed?

我写了一个简单的例子,希望有人能帮助我理解这段代码,以及为什么它在 Bifunction 中打印文本两次:

 var subject1: BehaviorSubject<String>? = null
    var subject2: BehaviorSubject<String>? = null





   override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        Log.v("mytag", "oncreate called now")
        subject1 = BehaviorSubject.createDefault("hello")
        subject2 = BehaviorSubject.createDefault("goodbye") //not subscribed to


        subject1?.subscribe { Log.v("subject1 it1", it) }


        btn.setOnClickListener {
            subject1?.onNext("hello btnclicked" + Random().nextInt(9000))

            ObservableCombineLatest.combineLatest(
                    subject1,subject2, BiFunction<String,String,String>
            { t1, t2 -> "biFun call" }).
                    subscribe { msg-> Log.d("mytag","combined latest update: $msg")}
        }
    }

}

当我第一次点击按钮时,这是输出:

 07-13 00:55:09.124 10559 10559 D mytag   : combined latest update: biFun call
07-13 00:55:09.130 10559 10559 D mytag   : combined latest update: biFun call

但是为什么呢?只有一个主题发生了变化,那就是 subject1 变量。当我单击按钮时,它调用 onNext 开始发射。为什么要打印两次?我期待因为 subject2 从未使用过它不会触发。

这对我有用:

import org.junit.Test;

import io.reactivex.subjects.BehaviorSubject;
import io.reactivex.Observable;

public class BehaviorSubjectCombineLatest {

    BehaviorSubject<String> subject1;
    BehaviorSubject<String> subject2;

    @Test
    public void test() {
        subject1 = BehaviorSubject.createDefault("hello");
        subject2 = BehaviorSubject.createDefault("goodbye");

        subject1.subscribe(v -> System.out.println("Subject1 it1: " + v));

        click();
    }

    void click() {
        subject1.onNext("hello button clicked " + System.currentTimeMillis());

        Observable.combineLatest(subject1, subject2, 
            (a, b) -> "biFun call " + a + ", " + b)
        .subscribe(v -> System.out.println("Combined latest: " + v));
    }
}

打印:

Subject1 it1: hello
Subject1 it1: hello button clicked 1531467839204
Combined latest: biFun call hello button clicked 1531467839204, goodbye

但是,如果您 "click" 多次,您将创建越来越多的 combineLatest,从而产生更多的重复打印输出。点击三下:

Subject1 it1: hello
Subject1 it1: hello button clicked 1531467945206
Combined latest: biFun call hello button clicked 1531467945206, goodbye
Subject1 it1: hello button clicked 1531467945240
Combined latest: biFun call hello button clicked 1531467945240, goodbye
Combined latest: biFun call hello button clicked 1531467945240, goodbye
Subject1 it1: hello button clicked 1531467945242
Combined latest: biFun call hello button clicked 1531467945242, goodbye
Combined latest: biFun call hello button clicked 1531467945242, goodbye
Combined latest: biFun call hello button clicked 1531467945242, goodbye