Newer
Older
DevAndroid / app / src / main / java / keijumt / devandroid / common / Task.kt
package keijumt.devandroid.common

import android.os.AsyncTask
import java.util.concurrent.CountDownLatch

class Task(val callback: Callback<Int>) : AsyncTask<Void, Void, Int>() {

    override fun doInBackground(vararg params: Void?): Int {
        val countDownLatch = CountDownLatch(2)
        var value1 = 0
        var value2 = 0

        val squireTask1 = SquareTask(object : Callback<Int> {
            override fun execute(value: Int) {
                value1 = value
            }
        }, countDownLatch)
        val squareTask2 = SquareTask(object : Callback<Int> {
            override fun execute(value: Int) {
                value2 = value
            }
        }, countDownLatch)

        squireTask1.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, 3)
        squareTask2.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, 5)

        countDownLatch.await()
        return value1 * value2
    }

    override fun onPostExecute(result: Int?) {
        callback.execute(result!!)
    }

    private class SquareTask(val callback: Callback<Int>, val countDownLatch: CountDownLatch) : AsyncTask<Int, Void, Int>() {
        override fun doInBackground(vararg params: Int?): Int {
            val value = params.get(0)!!
            return value * value
        }

        override fun onPostExecute(result: Int?) {
            callback.execute(result!!)
            countDownLatch.countDown()
        }
    }

    interface Callback<T> {
        fun execute(value: T)
    }
}