Android TimerTask大不精确

时间:2013-05-13 12:08:50

标签: android timer android-asynctask timertask

我在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秒(这是用于安排的时间)。 当我说“更多”时,我的意思是甚至几分钟。

怎么了?我需要一个精确的计时系统,我可以忍受几秒但没有分钟。

此外,即使设备处于待机状态,我也需要此计划处于活动状态

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

  

在真实的环境中,这些更新将每10分钟或更长时间运行一次,在我的测试中,我使用10秒

这更明智。

  

如果这些是我的要求,你有什么建议?

删除所有现有代码。

然后,设置AlarmManager ELAPSED_REALTIME_WAKEUP个事件,与BroadcastReceivermy WakefulIntentService或您自己的IntentService / WakeLock逻辑相关联。您需要这种组合,以便即使设备处于待机状态,也可以满足您的调度要求。要求。