2

我可能在 MediatorLiveData 源行为中遇到了一个错误。如果您将 LiveData 作为源添加到 MediatorLiveData,然后在观察者中再次将其删除,则源 LiveData 将重新进入活动状态,即使不应再注册任何观察者:

MutableLiveData<String> stringData = new MutableLiveData<String>() {
    @Override
    protected void onActive() {
        super.onActive();
        System.out.println("stringData onActive()");
    }

    @Override
    protected void onInactive() {
        super.onInactive();
        System.out.println("stringData onInactive");
    }
};

MediatorLiveData<Integer> intData = new MediatorLiveData<>();

在您的 LifecycleOwner 中:

intData.addSource(stringData, s -> {
        System.out.println("stringData emitted " + s);
        intData.removeSource(stringData);
    });

// note the order here, value of the source LiveData is set before 
// observer gets registered:
stringData.setValue("blabla");
intData.observe(this, integer -> {});

输出:

System.out: stringData onActive()
System.out: stringData emitted blabla
System.out: stringData onInactive
System.out: stringData onActive()

这里发生了什么?我希望 stringLiveData 保持不活动状态?这是错误还是预期行为?

有趣的是,如果您在注册观察者后调用 stringData.setValue(),则行为与预期一致(仅日志输出的前三行)。

我正在使用版本 1.0.0 Alpha 9-1。

4

0 回答 0