मेरे पास निम्न परिदृश्य है। पॉडकास्ट इंटरनेट से आ सकते हैं या स्थानीय (डीबी) दोनों लाइवडाटा हैं

// Live
private val _live = MutableLiveData<List<Podcast>>()
val live: LiveData<List<Podcast>> = _live

// Local
val local: LiveData<List<Podcast>> = dao.observePodcasts()

// Combined
val podcasts: LiveData<List<Podcast>> = ...

मेरा प्रश्न है: - मैं केवल एक LiveData podcasts का उपयोग कैसे कर सकता हूं ताकि मांग पर मैं लाइव या स्थानीय से डेटा प्राप्त कर सकूं

fun search(query: String) {
    // podcasts <- from live
}

fun subcribed() {
    // podcasts <- from local
}
3
Emmanuel Mtali 23 अगस्त 2021, 02:41

4 जवाब

सबसे बढ़िया उत्तर

MediatorLiveData का उपयोग करना मेरी अपेक्षाओं के अनुरूप नहीं था क्योंकि मैं चाहता था कि मैं स्थानीय के बीच स्विच कर सकूं और जब चाहूं लाइव हो सकूं!

इसलिए मैंने कार्यान्वयन इस प्रकार किया

enum class Source {
    LIVE, LOCAL
}

private val _live = MutableLiveData<List<Podcast>>()
private val _local = dao.observePodcasts()
private val source = MutableLiveData<Source>(Source.LOCAL)

// Universal
val podcasts: LiveData<List<Podcasts>> = source.switchMap {
    liveData {
        when (it) {
            Source.LIVE -> emitSource(_live)
            else -> emitSource(_local)
        }
    }
}

emitSource () पहले जोड़े गए स्रोत को हटा देता है।

फिर मैंने निम्नलिखित दो विधियों को लागू किया

fun goLocal() {
    source.postValue(Source.LOCAL)
}

fun goLive() {
    source.postValue(Source.LIVE)
}

मैं जब भी लाइव या स्थानीय भंडारण से पर्यवेक्षक के लिए सम्मानित समारोह को कॉल करता हूं

उपयोग के मामलों में से एक

searchItem.setOnActionExpandListener(object : MenuItem.OnActionExpandListener {
    override fun onMenuItemActionExpand(p0: MenuItem?): Boolean {
        viewModel.goLive()
        return true
    }

    override fun onMenuItemActionCollapse(p0: MenuItem?): Boolean {
         viewModel.goLocal()
         return true
    }
})
0
Emmanuel Mtali 23 अगस्त 2021, 21:23

आप इस मामले में MediatorLiveData का इस्तेमाल कर सकते हैं। आपको MediatorLiveData के साथ क्या करने की आवश्यकता है LiveData स्रोतों की आवश्यकता है ताकि LiveData स्रोत में परिवर्तन सुनने में सक्षम हो सकें।

निम्नलिखित का प्रयास करें:

YourViewModel.kt

private val _podcasts = MediatorLiveData<List<Podcast>>().apply {
    addSource(_live) { dataApi ->
        // Or you can do something when `_live` has a change in value.
        if(local.value == null) {
            this.value = dataApi  
        }
    }

    addSource(local) { dataLocal ->
        // Or you can do something when `local` has a change in value.
        if(_live.value == null) {
            this.value = dataLocal
        }
    }
}
val podcasts: LiveData<List<Podcast>> = _podcasts
3
Dương Minh 23 अगस्त 2021, 07:06

मध्यस्थलाइवडेटा

मैंने व्यक्तिगत रूप से projects उसी फ़ंक्शन को प्राप्त करने के लिए जिसका आप वर्णन कर रहे हैं।

जैसा कि सीधे डॉक्स से उद्धृत किया गया है क्योंकि वे बहुत सीधे आगे हैं ...

निम्नलिखित परिदृश्य पर विचार करें: हमारे पास LiveData के 2 उदाहरण हैं, आइए उन्हें liveData1 और liveData2 नाम दें, और हम उनके उत्सर्जन को एक ऑब्जेक्ट में मर्ज करना चाहते हैं: liveDataMerger। फिर, LiveData1 और liveData2 MediatorLiveData liveDataMerger के लिए स्रोत बन जाएंगे और हर बार उनमें से किसी एक के लिए ऑन चेंजेड कॉलबैक को कॉल करने पर, हम liveDataMerger में एक नया मान सेट करते हैं।

LiveData liveData1 = ...;
LiveData liveData2 = ...;

MediatorLiveData liveDataMerger = new MediatorLiveData<>();
liveDataMerger.addSource(liveData1, value -> liveDataMerger.setValue(value));
liveDataMerger.addSource(liveData2, value -> liveDataMerger.setValue(value));
2
JakeB 23 अगस्त 2021, 00:02

जैसा कि पहले ही सुझाव दिया गया है, इसे MediatorLiveData के साथ पूरा किया जा सकता है। LiveData के संयोजन के बजाय एक अन्य विकल्प flows का उपयोग करना होगा।

    val podcasts = combine(local, live) { local, live ->
        // Add your implementation of how you would like to combine them
        live ?: local
    }.asLiveData(viewModelScope.coroutineContext)

यदि आप कक्ष का उपयोग कर रहे हैं, तो आप फ़्लो परिणाम प्राप्त करने के लिए बस वापसी प्रकार को फ़्लो में बदल सकते हैं। और MutableLiveData के लिए आप इसे MutableStateFlow से बदल सकते हैं।

0
Luciano 23 अगस्त 2021, 10:03