2017-08-14 173 views
0

我爲什麼下面的代碼不工作有點糊塗了:的Android MediatorLiveData觀察者

MutableLiveData<String> mutableTest = new MutableLiveData<>(); 
MediatorLiveData<String> mediatorTest = new MediatorLiveData<>(); 
mediatorTest.addSource(mutableTest, test -> { 
    Timber.d(test); 
}); 
mutableTest.setValue("bla!"); 

這段代碼看起來非常簡單,但是調試器不進入回調並沒有被記錄到控制檯...

編輯:應該不是這個工作呢?

MutableLiveData<String> mutableTest = new MutableLiveData<>(); 
    MediatorLiveData<String> mediatorTest = new MediatorLiveData<>(); 
    mediatorTest.observe(loginActivity, str -> Timber.d(str)); 
    mediatorTest.addSource(mutableTest, str -> Timber.d(str)); 
    mutableTest.setValue("bla!"); 
+0

沒有什麼是觀察'mediatorTest'。沒有活躍的觀察員時,會跳過很多東西。 – CommonsWare

+0

@CommonsWare在這個例子中,觀察者不是'mutableTest' observable和'mediatorTest'嗎?爲什麼我需要觀察'mediatorTest'?我找不到一個簡化的演示,它給了我期望的結果。我認爲'addSource'應該是將偵聽器添加到'mediatorTest'觀察器,其中'mutableTest'在第一個參數中作爲可觀察值傳遞,而lambda在第二個參數中作爲回調傳遞。 – Trace

+0

'mediatorTest'既是觀察者又是觀察者。畢竟這是一個'LiveData',這意味着它是可觀察的。 「爲什麼我需要觀察mediatorTest?」 - 必須消耗數據。這是一個觀察員。你有兩個'LiveData'對象,但只有一個被觀察到。 「MediatorLiveData」的主要用途AFAIK用於轉換,並且在那裏,轉換方法(例如'map()')返回'MediatorLiveData',然後觀察它以查看轉換的結果。 – CommonsWare

回答

4

這個答案很大程度上是@CommonsWare已經在上面評論部分分享的。

爲了MediatorLiveData的addSource方法的回調被觸發,MediatorLiveData對象也需要被觀察。

這背後的邏輯是'介體'介於它觀察的LiveData對象和數據的最終用戶之間。因此調解員是觀察員並可同時觀察,並且在沒有活躍的觀察員時調解員不會觸發addSource的回調。

作爲一個例子;根據Google的Android體系結構組件,一個活動或片段可以讓觀察者觀察ViewModel上的中介,後者又可以觀察在ViewModel中處理的其他LiveData對象或引用的實用程序類。

@CommonsWare指出了Transformation類的使用,該類揭示了方法mapswitchMap,但這些不在我的用例範圍之內,儘管他們值得檢查。