如何解决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
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。