Kotlin协程从模型中返回mvvm

问题描述

我正在使用Kotlin中的协程进行爬网逻辑,但是我不知道这段代码是正确的。

这是模型课

  suspend fun parseYgosu() : Elements? {
    var data:Elements? = null

    var x : Deferred<Elements?> = Coroutinescope(dispatchers.IO).async {
        var doc = Jsoup.connect("https://www.ygosu.com/community/real_article").get()
        data = doc.select("div.board_wrap tbody tr")
        data
    }
        x.await()
    Log.d(TAG,"$data")
    return data
}

代码有问题。我不希望它是一个挂起函数。 我也想通过从存储库类中调用函数获取数据。 你能帮我吗?

解决方法

您可以使用liveData builder

fun parseYgosu(): LiveData<Elements?> = liveData {  
    val element = withContext(Dispatchers.IO) {
        Jsoup.connect("https://www.ygosu.com/community/real_article")
            .get()
            .select("div.board_wrap tbody tr")
    }
    emit(element)
}

和用户界面方面:

// for fragment
viewModel.parseYgosu().observe(viewLifecycleOwner,Observer { element -> ... })
// or for activity
viewModel.parseYgosu().observe(this,Observer { element -> ... })
,

盯着未来的延期,如果您不希望它被暂停,那么您就不能拥有await()

// Not suspend
fun parseYgosuAsync() = CoroutineScope(Dispatchers.IO).async {
    val doc = Jsoup.connect("https://www.ygosu.com/community/real_article").get()
    val data = doc.select("div.board_wrap tbody tr")
    Log.d(TAG,"$data")
    data
}