【问题标题】:best way for running code in async with kotlin与 kotlin 异步运行代码的最佳方法
【发布时间】:2020-06-01 19:04:16
【问题描述】:

嗨,我想使用 jsoup 从 html 加载一个大表,以异步方式执行此操作的最佳方法是什么? 异步任务?协程? doasync 库?哪一个?我需要在获取数据时显示进度条,所以请告诉我最好的方法是什么?

更新: 我想异步运行这段代码

doc: Document = Jsoup.connect(url).timeout(0).maxBodySize(0).ignoreHttpErrors(true).sslSocketFactory(setTrustAllCerts()).get()
// some code for parsing...

【问题讨论】:

  • 在这三个中,我会使用协程,也许会输入LiveData 以供 UI 层使用。
  • @CommonsWare 你能给我一个例子吗?

标签: android asynchronous kotlin android-asynctask jsoup


【解决方案1】:

在 Kotlin 中,一般方法是协程,但普通线程也是一个完全不错的选择,具体取决于您正在做什么。

例如,如果您的操作是线程阻塞操作,它实际上不能在协程中安全运行,除非它在单独的线程中分派。对于协程,你需要知道suspendingblocking之间的区别(巨大的区别)。

所以如果读取 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 线程。这就是您的阻塞代码将运行的地方。

【讨论】:

    【解决方案2】:

    我会建议您尝试使用 Kotlin 协程。这将使您能够分派昂贵或长时间运行的操作,即查询数据库,向其他线程发出网络请求/调用,从而不会阻塞主线程。协程可帮助您避免回调的麻烦。此外,Google 弃用了 AsyncTask API(在 Android 11 中),并建议使用 Java 的并发框架或 Kotlin 协程作为实现多线程目的的方式。

    【讨论】:

    • 谢谢你,你能给我一个例子吗?我更新了我的问题并添加了我想异步运行的代码
    • @Clay07g 提供的答案显示了如何完成此操作(;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    相关资源
    最近更新 更多