iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 10
1
Software Development

高中生Kotlin實作30天系列 第 10

Day 10 打地鼠(下)(AsyncTask)

  • 分享至 

  • xImage
  •  

接續上篇

Method

計時器

使用Handler和Thread作為遊戲的計時器

var handler = Handler(Handler.Callback {
    when (it.what) {
        1 -> {
            //m和s是外部變數,代表分秒
            tv_time.text = String.format("%02d:%02d", m, s)
        }
    }
    true
})
fun timer() {
    Thread(Runnable {
        while(s+m !=0){
            Thread.sleep(1000)
            s--
            if(s==-1){
                m--
                s=59
            }
            val msg= Message()
            msg.what = 1
            handler.sendMessage(msg)
        }
        //當時間到時重設畫面
        reset()
    }).start()
}

AsyncTask

另一個可以進行非同步執行的類別,結合了Thread、Message和Handler,可以方便地和Main Thread進行溝通,所以常用在進度條的更新
有三個需要override的方法

  • doInBackground()
    在Background Thread執行的任務
  • onProgressUpdate()
    當進度更新時,對畫面進行的更新
  • onPostExecute()
    當任務結束時的結果處理
fun gameStart() {
    //傳入的三個參數代表:輸入的型別、進度更新的型別、結果回傳的型別
    object : AsyncTask<Void,Void,Int>(){
        override fun doInBackground(vararg p0: Void?) :Int{
            //以防最後一秒還產生新的畫面
            //所以提早三秒結束
            while(!(s<=3 && m==0)){
                //隨機延遲1~3秒
                Thread.sleep((Math.random()*3+1).toLong()*1000)
                //若在延遲期間計時器已歸零 則直接結束迴圈
                if(s<=3 && m==0)
                    break
                //啟動onProgressUpdate
                publishProgress()
            }
            return 0
        }

        override fun onProgressUpdate(vararg values: Void?) {
            //產生新的畫面
            newRound()
        }

        override fun onPostExecute(result: Int?) {
            //讓TextView可以點選
            tv_time.isClickable = true
            tv_time.text = "重新開始"
        }
    }.execute()
}

開始遊戲

這邊把顯示時間的TextView當作開始遊戲的按鈕

tv_time.setOnClickListener {
    //讓TextView無法點選
    tv_time.isClickable = false
    m = 1
    s = 0
    timer()
    gameStart()
}

實作成果

本次沒有任何貓咪受到傷害


上一篇
Day 09 打地鼠(上)(GridView)
下一篇
Day 11 記帳本(RecyclerView)
系列文
高中生Kotlin實作30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
阿展展展
iT邦好手 1 級 ‧ 2020-01-06 13:48:19

本次沒有任何貓咪受到傷害 /images/emoticon/emoticon37.gif

我要留言

立即登入留言