在android中安排任务

时间:2010-05-18 12:15:11

标签: 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);

2 个答案:

答案 0 :(得分:17)

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是您之前发布的可运行的。

答案 1 :(得分: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);
    }
}