NEVER使用Thread.sleep()
。如果你這樣做,你會阻止當前Thread
。這意味着,如果您要在UI Thread
上調用Thread.sleep()
,則界面會凍結,您無法再與其進行交互,就像您遇到過的情況一樣。有多種選擇來安排未來的任務或事件。您可以:
- 使用
Timer
- 使用
Handler
與postDelayed()
- 使用
AlarmManager
使用Timer
Timer
可用於安排TimerTask
。他們最適合安排幾秒鐘的任務,也許幾分鐘到將來。
首先你必須寫一個TimerTask
。該任務將在一段時間後執行。一個TimerTask
可能是這樣的:
private class ExampleTask extends TimerTask {
@Override
public void run() {
// This method is called once the time is elapsed
}
}
而且你可以安排TimerTask
這樣的:
Timer timer = new Timer();
ExampleTask task = new ExampleTask();
// Executes the task in 500 milliseconds
timer.schedule(task, 500);
使用Handler
與postDelayed()
使用Handler
是非常類似於使用一個Timer
,但我個人更喜歡使用Timer
因爲他們更適合這樣的工作。 Handler
原本是爲了方便Threads
和其他事情之間的溝通,但它們也可以用於安排Runnable
。首先,我們必須定義一個Runnable
,這是非常類似TimerTask
:
Runnable runnable = new Runnable() {
@Override
public void run() {
// This method will be executed in the future
}
};
現在,我們安排Runnable
在未來postDelayed()
執行:
Handler handler = new Handler();
// Execute the Runnable in 500 milliseconds
handler.postDelayed(runnable, 500);
使用AlarmManager
該AlarmManager
是一個系統服務,可用於發送一個Intent
在未來的某個時刻。您可以使用AlarmManager
將此Intent
安排在未來數月甚至數年,唯一的缺點是您必須在重新啓動電話時重置所有警報。
你可以得到AlarmManager
這樣的:
AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
您還需要包裹Intent
要在PendingIntent
派:
Intent intent = new Intent(SOME_ACTION);
... // Setup your intent
PendingIntent pendingIntent = PendingIntent.getService(context, REQUEST_CODE, intent, PendingIntent.FLAG_CANCEL_CURRENT);
而且你可以安排Intent
發送在特定的Date
這樣的:
manager.set(AlarmManager.RTC, date.getTime(), pendingIntent);
'的Thread.sleep()'在這種情況下將發出'主事件處理UI thread'睡覺,所以應用程序完全凍結。使用某種類型的Timer,如CountDownTimer。 – EpicPandaForce
或postDelayed與處理程序 –