在android中安排任务
我正在使用下面的代码来安排在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);
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是先前发布的可运行。
此代码将导致内存泄漏 – 2015-04-10 01:37:47
我得到了答案按下面的代码:
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);
}
}
请只调用'postDelayed ()'在任何'View'上。没有'Timer',没有'TimerTask',没有额外的线程,并且不需要'Handler'。 – CommonsWare 2010-11-14 23:32:38
@CommonsWare如果当你需要一个重复计时器? – StarDust 2013-11-16 03:01:29
@StarDust:再次调用'postDelayed()',作为您使用第一个'postDelayed()'调度的'Runnable'完成的工作的一部分:https://github.com/commonsguy/cw-omnibus/tree/主/线程/ PostDelayed – CommonsWare 2013-11-16 03:03:04
对于那些想要计划服务/活动开始或广播的人,请查看[AlarmManager](http://developer.android.com/reference/android/app/AlarmManager.html) – 2013-08-14 02:44:27