Последовательное составление AsyncTasks в Android с Kotlin - PullRequest
0 голосов
/ 08 июня 2018

Я довольно новичок в Kotlin, и я хочу составить AsyncTask, как и в Scala, чтобы они запускались последовательно (чтобы избежать гонки):

def f(): Future[Unit]
def g(): Future[Unit]
f.map(_ -> g)

или

for {
  _ <- f
  _ <- g
} yield () 

Для этого я бы хотел как-то расширить моего помощника:

fun doAsync(handler: () -> Unit): AsyncTask<Void, Void, Unit> =
  object : AsyncTask<Void, Void, Unit>() {
    override fun doInBackground(vararg params: Void?) {
      try {
        handler()
      }
      catch (t: Throwable) { 
        Log.e("AsyncTask", "fail", t)
      }
    }
  }.execute()

Я знаю, что есть что-то вроде onPostExecute, но я не знаю, как изменить моего помощника, чтобы использовать его.

1 Ответ

0 голосов
/ 08 июня 2018

Асинхронные задачи, после Honey Comb запускаются последовательно.Цитирование из документации

При первом представлении AsyncTasks выполнялись последовательно в одном фоновом потоке.Начиная с Build.VERSION_CODES.DONUT, это было изменено на пул потоков, позволяющий нескольким задачам работать параллельно.Начиная с Build.VERSION_CODES.HONEYCOMB, задачи выполняются в одном потоке, чтобы избежать распространенных ошибок приложения, вызванных параллельным выполнением.

Если вы действительно хотите параллельное выполнение, вы можете вызвать executeOnExecutor (java.util.concurrent.Executor)., Object []) с THREAD_POOL_EXECUTOR.

И, асинхронная задача предназначена для небольших операций, если у вас долгосрочная задача, лучше используйте другие API.

Кроме того, вы всегда можете указать исполнителя, вызвав executeOnExecutor ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...