问题描述
我正在使用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
}