目次

AsyncTaskとCoroutine

AsyncTaskと同等の機能をKotlinのCoroutine(コルーチン)で実装

AsyncTask

import android.os.AsyncTask
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import kotlinx.android.synthetic.main.activity_main.*
 
class MainActivity : AppCompatActivity() {
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
 
        Log.i("async","onCreate: ${Thread.currentThread().name}")
        button.setOnClickListener {
            MyAsyncTask().execute()
        }
 
    }
 
   inner class MyAsyncTask:AsyncTask<Void,Int,Void>(){
 
        override fun onPreExecute() {
            Log.i("async","onPreExecute: ${Thread.currentThread().name}")
            super.onPreExecute()
            text.text="onPreExecute"
            Thread.sleep(800)
        }
 
        override fun doInBackground(vararg p0: Void?): Void? {
            Log.i("async","doInBackground: ${Thread.currentThread().name}")
            for(i in 1..3){
                publishProgress(i)
                Thread.sleep(800)
            }
            return null
        }
 
        override fun onProgressUpdate(vararg values: Int?) {
            Log.i("async","onProgressUpdate: ${Thread.currentThread().name}")
            super.onProgressUpdate(*values)
            text.text="onProgressUpdate${values[0]}"
        }
 
       override fun onPostExecute(result: Void?) {
           Log.i("async","onPostExecute: ${Thread.currentThread().name}")
           super.onPostExecute(result)
           text.text="onPostExecute!"
       }
 
 
    }
}
 ↓
アプリ起動
onCreate: main
 
ボタン クリック
onPreExecute: main
doInBackground: AsyncTask #1
onProgressUpdate: main
onProgressUpdate: main
onProgressUpdate: main
onPostExecute: main

coroutine

       button.setOnClickListener {

            text.text="Pre"

            GlobalScope.launch(){
                for(i in 1..10){
                    delay(800)
                    text.text="coroutine:(${i}) ${Thread.currentThread().name}" // ここからは画面を編集できないと思ったけどできた。。。何故?
                }
            }

            text.text="End"

        }