package moe.yuuta.workmode.async import android.annotation.SuppressLint import android.os.AsyncTask object Async { fun beginTask(runnable: Runnable, callback: Callback): Stoppable { val task = @SuppressLint("StaticFieldLeak") object : AsyncTask>() { override fun onPostExecute(result: TaskResult) { callback.onStop(result.successful, result.result, result.e) } override fun doInBackground(vararg params: Void?): TaskResult { try { return TaskResult(true, runnable.run(), null) } catch (e: Throwable) { return TaskResult(false, null, e) } } override fun onPreExecute() { callback.onStart() } } val stoppable = object : Stoppable { override fun stop() { if (!isStopped()) task.cancel(true) } override fun isStopped(): Boolean = task.isCancelled } task.execute() return stoppable } } @FunctionalInterface interface Runnable { fun run(): T? } data class TaskResult( val successful: Boolean, val result: T?, val e: Throwable? )