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