kotlinで非同期のコードを実行するための最良の方法

ギット :

こんにちは、私は、HTMLからの大きなテーブルをロードするために使用jsoupをしたい、非同期な方法でこれを行うための最善の方法は何ですか?AsyncTask?コルーチン?doasyncライブラリ?どれ?私は、データをフェッチ中にプログレスバーを表示するので、何が最善の方法です教えてください必要がありますか?

UPDATE:私は非同期でこのコードを実行したいです

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

Kotlinでは、一般的なアプローチは、コルーチンですが、通常のスレッドは、あなたがやっていることに応じて、また完全に細かいオプションです。

あなたの操作がスレッドブロック操作であれば、それは別のスレッドに派遣していますしない限り、例えば、それは実際にコルーチンで安全に実行することはできません。コルーチンのために、あなたは違いを知る必要があり中断し、ブロック(大きな違いを)。

HTMLテーブルの読み取りがブロック操作で、あなたが他のコルーチンと統合する必要がないのであれば、通常のスレッドはうまく動作します。Kotlinに譲渡されている多くのJavaの例があります。

コルーチンでは、あなたのような何かを行うことができます:

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スレッド。これはあなたのものですブロッキングコードが動作します。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=20222&siteId=1