嗨,我想使用从html加载一个大表,以异步方式实现这一点的最佳方法是什么?AsyncTask?通心粉?多异步库?哪个?我需要显示进度条,同时获取数据,所以请告诉我什么是最好的方式?
更新:我希望在异步中运行这段代码。
doc: Document = Jsoup.connect(url).timeout(0).maxBodySize(0).ignoreHttpErrors(true).sslSocketFactory(setTrustAllCerts()).get()
// some code for parsing...发布于 2020-02-17 20:20:20
在Kotlin中,一般的方法是协同,但是正常的线程处理也是一个非常好的选择,这取决于您正在做什么。
例如,如果您的操作是线程阻塞操作,那么它实际上无法在协同线中安全运行,除非它在单独的线程中被分派。对于协同,您需要知道挂起和阻塞之间的区别(巨大的差异)。
因此,如果读取HTML表是一种阻塞操作,并且不需要与其他协同操作集成,那么正常的线程就能正常工作。有许多Java示例可以转移到Kotlin。
使用协同机制,您可以做如下事情:
suspend fun getDoc() = withContext(Dispatchers.IO) {
Jsoup.connect(url).timeout(0).maxBodySize(0).ignoreHttpErrors(true).sslSocketFactory(setTrustAllCerts()).get()
}然后,在您的主要代码中:
fun main() = runBlocking {
val deferredDoc = async { getDoc() }
// Do whatever.... it's not being blocked...
val doc = deferredDoc.await() // SUSPENDING CALL - but not blocking
}显然,您的程序的结构将与本例不同,因为它完全取决于您希望使用"getDoc()“异步执行哪些代码。
例如,您甚至可以在"deferredDoc.await()“挂起时执行另一个协同线,甚至无需创建另一个线程。这就是协同作战的好处。
在上面的结构中,我们有三个有保证的线程:
发布于 2020-02-17 19:46:30
我建议你试试Kotlin Coroutines。这将使您能够分派昂贵的或长期运行的操作,即查询数据库,将网络请求/调用关闭到其他线程,从而不会阻塞主线程。协同服务可以帮助您避免回调带来的麻烦。此外,谷歌也反对使用Java(在Android11中),并建议使用AsyncTask的并发框架或Kotlin作为实现多线程的方法。
https://stackoverflow.com/questions/60269382
复制相似问题