2010-05-18 81 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