如何在Android中没有新类的简单计时器?

时间:2011-09-15 15:22:24

标签: java android timer

我正在为Android开发一个必须在后台运行的服务,每100秒执行一次功能。那是源代码(例子)

package com.example

import ....

public class Servizio extends Service {

    public IBinder onBind(Intent intent) {

    }

    public void onCreate() {

    }

    public void onDestroy() {

    //here put the code that stop the timer cycle

    }

    public void onStart(Intent intent, int startid) {

    //i want to begin here the timercycle that each 100 s call myCycle()

    }

    public void myCycle() {

    //code that i can't move on other class!!!

    }

}

我怎么能这样做?现在服务执行myCycle()一次,因为我在onStart()中调用了一个。

3 个答案:

答案 0 :(得分:7)

Timer使用TimerTask。要每100秒执行一次方法,您可以在onStart方法中使用以下内容。请注意,此方法会创建一个新线程。

new Timer().schedule(new TimerTask() {
     @Override
     public void run() {
         myCycle();
     }
}, 0, 100000);

或者,使用本文所述的android.os.HandlerUpdating the UI from a Timer。它比Timer更好,因为它在主线程中运行,避免了第二个线程的开销。

private Handler handler = new Handler();
Runnable task = new Runnable() {
    @Override
    public void run() {
        myCycle();
        handler.postDelayed(this, 100000);
    }
};
handler.removeCallbacks(task);
handler.post(task);

答案 1 :(得分:2)

我通常会这样做,如果我理解正确,你希望myCycle每100秒执行一次。

Timer myTimer = new Timer();
myTimer.schedule(new TimerTask() {
    @Override
    public void run() {
        myCycle();
    }
}, 0,100000);

答案 2 :(得分:1)

当我遇到这个问题时,我定期呼叫网络服务,这是我的解决方案:

public class MyService extends Service {
    private Handler mHandler = new Handler();
    public static final int ONE_MINUTE = 60000;
    private Runnable periodicTask = new Runnable() {
        public void run() {
            mHandler.postDelayed(periodicTask, 100 * ONE_MINUTE);
            token = retrieveToken();
            callWebService(token);
        }
    };

我提前调用postDelayed,以便webservice调用的延迟不会导致时间转换。

这两个函数实际上在MyService类中。

<强>更新

您可以将Runnable传递给postDelayed,如下所示:

http://developer.android.com/reference/android/os/Handler.html#postDelayed(java.lang.Runnable, long)

  

public final boolean postDelayed(Runnable r,long delayMillis)

     

从以下版本开始:API Level 1导致Runnable r被添加到消息中   队列,在指定的时间量过去后运行。该   runnable将在附加此处理程序的线程上运行。

此外,由于缺少功能,我的代码将无法编译,这显示为OP可以执行的操作的示例。