使用Kotlin在Android中连续编写AsyncTasks

时间:2018-06-08 10:44:28

标签: android android-asynctask kotlin

我对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之类的内容,但我不知道如何更改我的助手以使用它。

1 个答案:

答案 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()

来指定执行程序