android - 与 kotlin 异步运行代码的最佳方式

标签 android asynchronous kotlin android-asynctask jsoup

您好,我想使用 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/

相关文章:

android - 我需要保护我的 Android 应用程序不被复制吗?

c# - 当我从任务中检索值时,如何更新父窗体上的 GUI?

java - 如何在 Java 而不是 Kotlin 中实现 SelectionTracker

android - 如何使用 kotlin 序列化我的类对象?

gradle - 缺少将Kotlin编译为javascript的kotlin.js.map文件

java - 我想知道为什么 FinalizerReference 在我的应用程序中消耗这么多内存

android - Spritesheet 与单个 Sprite 的映射,Android 性能

android - 设置为 Theme.NoTitleBar.Fullscreen 后应用崩溃

java - 在 Activity 之间传递 Future 对象

javascript - 嵌套 async/await 是反模式吗?