我在android中使用TimerTask时遇到问题。情况是这样的:
我有一个扩展AsyncTask的类,将它调用MyAsyncTask,我在另一个类中有一个静态方法,称之为SchedulerClass。
SchedulerClass有这个方法
TimerTask myTimerTask;
public static boolean scheduleMyJob() {
try {
Log.i(LOG_TAG,"entered in scheduleMyJob function");
MyAsyncTask task = new MyAsyncTask ();
myTimerTask = new TimerTask() {
@Override
public void run() {
try {
_task .execute("");
} catch (Exception e) {
Log.e(LOG_TAG, "error executing task");
}
}
};
Timer t = new Timer();
t.schedule(myTimerTask , 10000);
return true;
} catch (Exception e) {
Log.e(LOG_TAG, "error scheduling task");
return false;
}
}
和MyAsyncTask就是这样的
public class MyAsyncTask extends AsyncTask<String, Integer, String> {
@Override
protected String doInBackground(String... params) {
Log.i(LOG_TAG,"entered in MyAsyncTask.doInBackground method");
//DO MY STUFF
return "result";
}
@Override
protected void onPostExecute(String result) {
SchedulerClass.scheduleMyJob();
}
}
这种方法大部分时间都可以正常工作,但有时候myTimerTask会在超过10秒后调度:我可以读取日志"entered in scheduleMyJob function"
,但是日志"entered in MyAsyncTask.doInBackground method"
写入的时间超过10秒(这是用于安排的时间)。
当我说“更多”时,我的意思是甚至几分钟。
怎么了?我需要一个精确的计时系统,我可以忍受几秒但没有分钟。
此外,即使设备处于待机状态,我也需要此计划处于活动状态
感谢您的帮助
答案 0 :(得分:0)
在真实的环境中,这些更新将每10分钟或更长时间运行一次,在我的测试中,我使用10秒
这更明智。
如果这些是我的要求,你有什么建议?
删除所有现有代码。
然后,设置AlarmManager
ELAPSED_REALTIME_WAKEUP
个事件,与BroadcastReceiver
和my WakefulIntentService
或您自己的IntentService
/ WakeLock
逻辑相关联。您需要这种组合,以便即使设备处于待机状态,也可以满足您的调度要求。要求。