Типичное использование для AsyncTask: я хочу запустить задачу в другом потоке, и после того, как эта задача выполнена, я хочу выполнить некоторую операцию в моем потоке пользовательского интерфейса, а именно скрыть индикатор выполнения.
Задача должна быть запущена в TextureView.SurfaceTextureListener.onSurfaceTextureAvailable
, и после ее завершения я хочу скрыть индикатор выполнения. Выполнение этого синхронно не работает, потому что это блокирует поток, создающий пользовательский интерфейс, оставляя экран черным, даже не показывая индикатор выполнения, который я хочу скрыть впоследствии.
Пока я использую это:
inner class MyTask : AsyncTask<ProgressBar, Void, ProgressBar>() {
override fun doInBackground(vararg params: ProgressBar?) : ProgressBar {
// do async
return params[0]!!
}
override fun onPostExecute(result: ProgressBar?) {
super.onPostExecute(result)
result?.visibility = View.GONE
}
}
Но эти классы за пределами уродливых, поэтому я хотел бы избавиться от них.
Я хотел бы сделать это с соплинами kotlin. Я пробовал несколько вариантов, но ни один из них не работает. Скорее всего, я бы заподозрил:
runBlocking {
// do async
}
progressBar.visibility = View.GONE
Но это не работает должным образом. Насколько я понимаю, runBlocking
не запускает новый поток, как AsyncTask
, что мне и нужно. Но, используя сопрограмму thread
, я не вижу разумного способа получить уведомление о ее завершении. Кроме того, я также не могу поместить progressBar.visibility = View.GONE
в новый поток, потому что только поток пользовательского интерфейса может выполнять такие операции.
Я действительно новичок в сопрограммах, поэтому я не совсем понимаю, чего мне здесь не хватает.