原意想要實作出像是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