首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用kotlin在异步中运行代码的最佳方法

用kotlin在异步中运行代码的最佳方法
EN

Stack Overflow用户
提问于 2020-02-17 19:41:32
回答 2查看 2.6K关注 0票数 3

嗨,我想使用从html加载一个大表,以异步方式实现这一点的最佳方法是什么?AsyncTask?通心粉?多异步库?哪个?我需要显示进度条,同时获取数据,所以请告诉我什么是最好的方式?

更新:我希望在异步中运行这段代码。

代码语言:javascript
复制
doc: Document = Jsoup.connect(url).timeout(0).maxBodySize(0).ignoreHttpErrors(true).sslSocketFactory(setTrustAllCerts()).get()
// some code for parsing...
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-17 20:20:20

在Kotlin中,一般的方法是协同,但是正常的线程处理也是一个非常好的选择,这取决于您正在做什么。

例如,如果您的操作是线程阻塞操作,那么它实际上无法在协同线中安全运行,除非它在单独的线程中被分派。对于协同,您需要知道挂起阻塞之间的区别(巨大的差异)。

因此,如果读取HTML表是一种阻塞操作,并且不需要与其他协同操作集成,那么正常的线程就能正常工作。有许多Java示例可以转移到Kotlin。

使用协同机制,您可以做如下事情:

代码语言:javascript
复制
suspend fun getDoc() = withContext(Dispatchers.IO) {
    Jsoup.connect(url).timeout(0).maxBodySize(0).ignoreHttpErrors(true).sslSocketFactory(setTrustAllCerts()).get()
}

然后,在您的主要代码中:

代码语言:javascript
复制
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()“挂起时执行另一个协同线,甚至无需创建另一个线程。这就是协同作战的好处。

在上面的结构中,我们有三个有保证的线程:

  • 主线程,它总是阻塞
  • 主协同线程。这就是协同机制通常运行的内容。Kotlin协同器将在这个线程中使用suspension.
  • IO线程异步运行协同线程。这就是您的阻塞代码将运行的内容。
票数 2
EN

Stack Overflow用户

发布于 2020-02-17 19:46:30

我建议你试试Kotlin Coroutines。这将使您能够分派昂贵的或长期运行的操作,即查询数据库,将网络请求/调用关闭到其他线程,从而不会阻塞主线程。协同服务可以帮助您避免回调带来的麻烦。此外,谷歌也反对使用Java(在Android11中),并建议使用AsyncTask的并发框架或Kotlin作为实现多线程的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60269382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档