我正在为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()中调用了一个。
答案 0 :(得分:7)
Timer使用TimerTask。要每100秒执行一次方法,您可以在onStart
方法中使用以下内容。请注意,此方法会创建一个新线程。
new Timer().schedule(new TimerTask() {
@Override
public void run() {
myCycle();
}
}, 0, 100000);
或者,使用本文所述的android.os.Handler:Updating 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可以执行的操作的示例。