2010-05-18 79 views
8

我正在使用下面的代碼來安排在android中的任務,但它沒有給出任何結果。請告知。在android中安排任務

int delay = 5000; // delay for 5 sec. 
int period = 1000; // repeat every sec. 
Timer timer = new Timer(); 
timer.scheduleAtFixedRate(new TimerTask() { 

    public void run() { 
     Toast.makeText(getApplicationContext(),"RUN!",Toast.LENGTH_SHORT).show(); 
    } 

}, delay, period); 
+0

對於那些想要計劃服務/活動開始或廣播的人,請查看[AlarmManager](http://developer.android.com/reference/android/app/AlarmManager.html) – 2013-08-14 02:44:27

回答

16

TimerTasks不理想在Android環境中使用,因爲它們不是上下文感知。如果您的上下文消失,TimerTask仍然會耐心地在後臺等待,最終會觸發並可能導致應用程序崩潰,因爲它的活動先前已完成。或者,在關閉後它可能會繼續引用您的活動,從而阻止它被垃圾收集,並可能導致應用程序內存不足。

取而代之,請使用postDelayed(),它將在活動關閉時自動取消該任務。

final int delay = 5000; 
final int period = 1000; 
final Runnable r = new Runnable() { 
    public void run() { 
     Toast.makeText(getApplicationContext(),"RUN!",Toast.LENGTH_SHORT).show(); 
     postDelayed(this, period); 
    } 
}; 

postDelayed(r, delay); 

順便說一句,如果你需要手動取消你的任務,你可以使用removeCallbacks(r)其中R是先前發佈的可運行。

+0

此代碼將導致內存泄漏 – 2015-04-10 01:37:47

4

我得到了答案按下面的代碼:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    Timer timer = new Timer(); 

    timer.schedule(new ScheduledTaskWithHandeler(), 5000); 

} 

final Handler handler = new Handler() { 

    public void handleMessage(Message msg) { 
     Toast.makeText(getApplicationContext(), "Run!", 
      Toast.LENGTH_SHORT).show(); 
    } 
}; 

class ScheduledTaskWithHandeler extends TimerTask { 

    @Override 
    public void run() { 
     handler.sendEmptyMessage(0); 
    } 
} 
+3

請只調用'postDelayed ()'在任何'View'上。沒有'Timer',沒有'TimerTask',沒有額外的線程,並且不需要'Handler'。 – CommonsWare 2010-11-14 23:32:38

+0

@CommonsWare如果當你需要一個重複計時器? – StarDust 2013-11-16 03:01:29

+1

@StarDust:再次調用'postDelayed()',作爲您使用第一個'postDelayed()'調度的'Runnable'完成的工作的一部分:https://github.com/commonsguy/cw-omnibus/tree/主/線程/ PostDelayed – CommonsWare 2013-11-16 03:03:04