在Android中如何安排任务

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);

1
对于那些想要安排服务/活动开始或广播的人,请查看AlarmManager - Alexander Malakhov
2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
17

在 Android 环境中,TimerTasks 不是理想的使用方式,因为它们不具备上下文意识。如果您的上下文消失了,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是您之前发布的可运行对象。


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
请在任何 View 上仅调用 postDelayed() 方法,无需使用 TimerTimerTask 或额外的线程,也不需要 Handler。注意不要改变原意。 - CommonsWare
@CommonsWare 如果你需要一个重复计时器呢? - StarDust
1
@StarDust:在第一个postDelayed()调度的Runnable完成的工作中,再次调用postDelayed():https://github.com/commonsguy/cw-omnibus/tree/master/Threads/PostDelayed - CommonsWare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,