您好,我想使用 jsoup 从 html 加载一个大表,以异步方式执行此操作的最佳方法是什么? 异步任务?协程?同步库?哪一个?我需要在获取数据时显示进度条,所以请告诉我最好的方法是什么?
更新: 我想异步运行这段代码
doc: Document = Jsoup.connect(url).timeout(0).maxBodySize(0).ignoreHttpErrors(true).sslSocketFactory(setTrustAllCerts()).get()
// some code for parsing...
最佳答案
在 Kotlin 中,一般方法是协程,但普通线程也是一个完全不错的选择,具体取决于您在做什么。
例如,如果您的操作是线程阻塞操作,它实际上不能在协程中安全运行,除非它在单独的线程中分派(dispatch)。对于协程,您需要知道暂停 和阻塞 之间的区别(巨大的区别)。
所以如果读取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()”挂起时执行,甚至无需创建另一个线程。这就是协程的好处。
在上面的结构中,我们有 3 个保证线程:
- 主线程,总是被阻塞
- 主协程线程。这就是协程通常运行的地方。 Kotlin 协同程序将使用暂停在此线程内异步运行您的协同程序。
- IO线程。这是您的阻塞代码将运行的地方。
关于android - 与 kotlin 异步运行代码的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60269382/