livedata协程未观察到数据

时间:2020-08-30 04:04:39

标签: android android-livedata kotlin-coroutines coroutine

我在项目中使用MVVM体系结构。首次调用时,它可以工作。但是之后,它不起作用。 这是我的代码。

    class Solution:
        def twoSum(self, nums, target):
            """
            :type nums: List[int]
            :type target: int
            :rtype: List[int]
            """
            h = {}
            for i, num in enumerate(nums):
                n = target - num
                if n not in h:
                    h[num] = i
                else:
                    return [h[n], i]

}

 fun loadYgosuData() : LiveData<ArrayList<YgosuData>> {
   Log.d(TAG, "loadYgosuData()...")
   return liveData {
       Log.d(TAG, "liveData Scope running....")
       val element = withContext(Dispatchers.IO) {
           Jsoup.connect("https://www.ygosu.com/community/real_article")
               .get()
               .select("div.board_wrap tbody tr")
       }
       emit(setYgosuData(element))
   }

能帮我吗? 谢谢。

1 个答案:

答案 0 :(得分:2)

来自official doc

liveData构建块用作协程和LiveData之间的结构化并发原语。当LiveData变为活动状态时,该代码块开始执行;如果LiveData变为非活动状态,则在可配置的超时后自动取消该代码块。如果在完成之前将其取消,则如果LiveData再次变为活动状态,它将重新启动。如果它在先前的运行中成功完成,则不会重新启动。请注意,只有在自动取消后,它才会重新启动。如果该块由于其他任何原因而被取消(例如引发CancellationException),则不会重新启动。

这就是您第一次提到它的原因。

解决方案1:将liveData与Transformations

组合
private val body: MutableLiveData<String> = MutableLiveData()

val YgousData = body.switchMap {
    liveData {
        Log.d(TAG, "liveData Scope running....")
        val element = withContext(Dispatchers.IO) {
            Jsoup.connect("https://www.ygosu.com/community/real_article")
                .get()
                .select("div.board_wrap tbody tr")
        }
        emit(setYgosuData(element))
    }
}

fun callApi(param:String){
    body.value = param
}

您可以根据触发API调用的方式更改body

解决方案2:您可以显式进行api调用,然后将数据发布到livedata(不使用livedata构建器)