Я потратил некоторое время, чтобы найти дружественное для разработчика решение (без добавления зависимостей в проект) о том, как выполнить некоторую сложную задачу в фоновом потоке, а после завершения задачи вернуть результат в основной поток.Я нашел "AsyncTask", который позволяет это сделать.Но чтобы использовать его, вам нужно написать шаблонный код для каждой задачи, которую нужно запустить в фоновом режиме.Я разработчик iOS, который решил попробовать разработку под Android.Так что в Swift вы можете просто использовать следующий код для выполнения этой задачи:
DispatchQueue.global().async(execute: {
//Do some hard task in background
DispatchQueue.main.async(execute: {
//Return to main
})
})
Это выглядит довольно просто.Но в Котлине я не нашел такого простого решения и решил его создать.
Вот что я сделал:
Я создал общий класс
import android.os.AsyncTask
class BaseAsyncTask<M>: AsyncTask<()->M, Int, M>() {
var completion: ((M)->Unit)? = null
override fun doInBackground(vararg params: (() -> M)?): M? {
for (p in params) {
return p?.invoke()
}
return null
}
override fun onPostExecute(result: M) {
super.onPostExecute(result)
completion?.invoke(result)
}
}
И менеджер
class AsyncManager {
companion object {
fun <M>execute(inBackground: ()->M, inMain: (M)->Unit): BaseAsyncTask<M> {
val task = BaseAsyncTask<M>()
task.completion = inMain
task.execute(inBackground)
return task
}
fun <M>execute(inBackground: ()->M): BaseAsyncTask<M> {
val task = BaseAsyncTask<M>()
task.execute(inBackground)
return task
}
}
}
Теперь я использую это так:
AsyncManager.execute({
//Do some hard task in background
}, {
//Return to main
})
Выглядит как разработчик.
Log.e("MAIN", "MAIN THREAD SHOULD NOT BE BLOCKED")
AsyncManager.execute({
Log.e("TASK", "Started background task")
val retval = "The value from background"
Thread.sleep(5000)
Log.e("TASK", "Finished background task with result: " + retval)
retval
}, {
Log.e("TASK", "Started task in Main thread with result from Background: " + it)
})
Log.e("MAIN", "MAIN THREAD SHOULD NOT BE BLOCKED - 1")
И журнал:
2019-03-27 17: 11: 00.719 17082-17082 / com.test.testapp E / MAIN: ГЛАВНАЯ РЕЗЬБА НЕ ДОЛЖНА БЛОКИРОВАТЬ
2019-03-27 17: 11: 00.722 17082-17082 /com.test.testapp E / MAIN: ГЛАВНАЯ РЕЗЬБА НЕ ДОЛЖНА БЛОКИРОВАТЬСЯ - 1
2019-03-27 17: 11: 00.722 17082-17124 / com.test.testapp E / TASK: Запущена фоновая задача
2019-03-27 17: 11: 05.737 17082-17124 / com.test.testapp E / TASK: завершенная фоновая задача с результатом: значение из фона
2019-03-27 17: 11: 05.738 17082-17082 / com.test.testapp E / TASK: Запущено задание в главном потоке с результатом из Background: значение из фона
Итак, вопрос в том, что думают профессиональные разработчики AndroidТхис решением.Какую проблему я могу получить в случае, если я буду использовать это.И, возможно, есть какая-то причина не использовать это решение.