Android计时器任务

时间:2014-08-15 21:06:11

标签: android

我试图制作一个会在一定时间后做某件事的计时器:

 int delay = 1000; 

        int period = 1000; 

        Timer timer = new Timer();

        timer.scheduleAtFixedRate(new TimerTask() {

        public void run() {

            //Does stuff

        }
        }, delay, period);

然而,应用程序在等待期后崩溃。这是Java代码,因此它可能与Android不完全兼容(如while循环)。有什么我做错了吗?

3 个答案:

答案 0 :(得分:1)

这样的东西应该工作,创建一个处理程序,并等待1秒:)这通常是最好的方式,它是最整洁的,也可能是最好的内存,因为它没有真正做太多,加上因为只有这是最简单的解决方案才会这样做。

Handler handler = new Handler(); 
handler.postDelayed(new Runnable() { 
   public void run() { 
   // do your stuff
   } 
}, 1000); 

如果您希望每秒运行一次,那么这样的事情将是最好的:

Thread thread = new Thread()
{
    @Override
    public void run() {
        try {
            while(true) {
                sleep(1000);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
};
thread.start();

如果你想要一个GUI线程,那么这样的事情应该有效:

    ActivityName.this.runOnUiThread(new Runnable()
    {
     public void run(){
 try {
            while(true) {
                sleep(1000);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
     }
     });

答案 1 :(得分:1)

如果您的应用在等待之后崩溃,那么您的计时器任务正在执行其工作并按计划执行您的代码。问题必须出在run()出现的代码中(例如,您可能正在尝试更新后台线程中的UI元素)。

如果您发布更多代码和logcat,我可能会更具体地说明您遇到的错误,但您的问题与TimerTask有关。

答案 2 :(得分:1)

计时器,你也可以在UI线程上运行你的代码:

public void onCreate(Bundle icicle) {
     super.onCreate(icicle);
     setContentView(R.layout.main);
     myTimer = new Timer();
     myTimer.schedule(new TimerTask() {
        @Override
        public void run() {
            timerMethod();
        }
    }, 0, 1000);
}

private void timerMethod(){
    //  This method is called directly by the timer
    //  and runs in the same thread as the timer.
    //  We call the method that will work with the UI
    //  through the runOnUiThread method.
    this.runOnUiThread(timerTick);
}

private Runnable timerTick = new Runnable() {

    public void run() {
        //  This method runs in the same thread as the UI.               
        //  Do something to the UI thread here
    }
};