我对Kotlin很陌生,我希望像在Scala中一样编写AsyncTask执行,以使它们顺序运行(以避免竞争条件):
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
之类的内容,但我不知道如何更改我的助手以使用它。
答案 0 :(得分:3)
异步任务,在 Honey Comb 之后顺序运行。 引自documentation
首次引入时,AsyncTasks在单个上串行执行 背景线程。从Build.VERSION_CODES.DONUT开始,这是 更改为允许多个任务运行的线程池 平行。从Build.VERSION_CODES.HONEYCOMB开始,任务是 在单个线程上执行,以避免引起常见的应用程序错误 通过并行执行。
如果您真的想要并行执行,可以调用 executeOnExecutor(java.util.concurrent.Executor,Object [])with THREAD_POOL_EXECUTOR。
并且,异步任务是为小型操作而设计的,如果你有一个长时间运行,更好地使用其他Api。
此外,您始终可以通过调用executeOnExecutor()
来指定执行程序