Android – 觸發後只執行一次、要有時間性且更改UI的方法(AsycTask)

原意想要實作出像是delay多少秒之後要做UI更新

找到的方法是用timer、handler去做

 

不過用timer來計時每隔一段時間 重複執行某件事

再由handler去控制畫面UI的更新

-> 這個方法比較適合用在”重複執行”

 

對於這次我想要做的是,被觸發後,只想要執行一次

而這一次的動作,需要延遲幾秒鐘,且延遲完想要做些動作來恢復前面的改變

 

e.g. 在每個Trial間,想要插入間隔2000ms的空檔,實作方式用一張黑色底圖片蓋住原有圖,時間到後再把這張圖片拿掉

建立一個class繼承AsyncTask,其中要帶入三種參數<params, XXX, results > => 中間參數那項我忘記是什麼了

doInBackground是另一個會在背景執行thread,此範例是特地讓他delay一段時間

onPostExecute是執行完doInBackground後,會執行的一段程式,通常會用來顯示thread執行後的結果

在此例中,我拿來恢復原本的改變

private class TrialIntervalUpdate extends AsyncTask<Integer, Void, Integer> {
        @Override
        protected Integer doInBackground(Integer... params) {
            Log.e("doInBackground", "sleep "+params[0]+"ms");
            SystemClock.sleep(params[0]);
            return params[0];
        }

        protected void onPostExecute(Integer param)
        {
            Log.e("After "+ param + "ms","put img to back");
            trialIntervalImage.setImageAlpha(0);
        }
    }

 

創完class後,在想要觸發的地方,寫下:

            // 跑出來蓋住
            trialIntervalImage.bringToFront();
            trialIntervalImage.setImageAlpha(255);
            Log.e("clicked", "bringToFront and setAlpha 255");
            new TrialIntervalUpdate().execute(trialInterval);

先讓圖片跑到最上層、顯示不透明度255(最不透明 vs. 最透明是0)

再執行新的thread來實作delay,傳入想要delay的時間(int trialInterval)

 

 

參考:

1. 渺小且微不足道的晦暗 Android timer / sleep / delay / 更新 UI 的方法:

http://pontiffkao.blogspot.tw/2011/04/android-timer-sleep-delay-ui.html

2.  GIVEMEPASS’S ANDROID惡補筆記 無痛執行緒

http://givemepass.blogspot.tw/2011/10/blog-post.html

3. 老灰鴨的筆記本 【Android】AsyncTask – Thread 外的另一選擇

http://oldgrayduck.blogspot.tw/2013/01/androidasynctask-thread.html

4. Givemepass’s Android 惡補筆記 如何使用Handler

http://givemepass-blog.logdown.com/posts/296606-how-to-use-a-handler

作者

RongSon

Graduate Student of CCU COMM Game Development, Network Communication, macOS/Ubuntu/Android, Arduino/Raspberry Pi/Intel Edison, Java/Python/C/C++

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *