лучший способ для запуска кода в асин c с kotlin - PullRequest
1 голос
/ 17 февраля 2020

привет, я хочу использовать jsoup для загрузки большой таблицы из html, каков наилучший способ сделать это asyn c способом? AsyncTask? сопрограммы? doasyn c библиотека? который из? Мне нужно показывать прогресс-прогресс при получении данных, поэтому, пожалуйста, скажите мне, как лучше?

ОБНОВЛЕНИЕ: я хочу запустить этот код в asyn c

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

Ответы [ 2 ]

2 голосов
/ 17 февраля 2020

В Kotlin общий подход - сопрограммы, но нормальная многопоточность также является вполне подходящим вариантом, в зависимости от того, что вы делаете.

Например, если ваша операция является операцией блокировки потока фактически он не может безопасно работать в сопрограмме, если он не отправлен в отдельный поток. Для сопрограмм вам нужно знать разницу между приостановкой и блокировкой (огромная разница).

Так что, если чтение таблицы 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
}

Очевидно, что структура вашей программы будет выглядеть иначе, чем в этом примере, потому что она полностью зависит от того, какой код вы хотите выполнить асинхронно с помощью getDo c ().

Например, вы можете даже есть другая сопрограмма, которая выполняется, пока "deferredDo c .await ()" приостанавливается, даже не создавая другой поток. Это преимущество сопрограмм.

В приведенной выше структуре у нас есть 3 гарантированных потока:

  • Основная нить, которая всегда блокируется
  • Основная нить сопрограммы. Это то, на чем обычно работают сопрограммы. Kotlin сопрограммы будут запускать ваши сопрограммы асинхронно внутри этого потока, используя приостановку.
  • поток ввода-вывода. Это то, на чем будет работать ваш код .
0 голосов
/ 17 февраля 2020

Я тебе советую попробовать Kotlin Сопрограммы. Это позволит вам отправлять дорогостоящие или длительные операции, то есть запрашивать базы данных, отправлять сетевые запросы / вызовы другим потокам, тем самым не блокируя основной поток. Сопрограммы помогут вам избежать хлопот обратных вызовов. Кроме того, Google устарел в AsyncTask API (в Android 11) и рекомендует использовать платформу параллелизма Java или Kotlin сопрограммы в качестве пути к go для многопоточности.

...