2013-05-13 42 views
0

我有一個問題,在android中使用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秒(這是用於調度的時間)後寫入的。 當我說「更多」時,我的意思是分鐘。

有什麼不對?我需要一個精確的計時系統,我可以忍受幾秒鐘,但沒有幾分鐘。

而且我需要這個安排是積極的,即使設備處於待機

感謝所有幫助

+0

「此外,即使設備處於待機狀態,我也需要此計劃處於活動狀態」 - 這意味着您絕不允許設備進入「待機」狀態。除非這樣做只會在非常短的時間內完成,並且完全在用戶控制下進行,否則用戶會對電量消耗不滿。 – CommonsWare 2013-05-13 12:30:32

+0

這個應用程序在商業環境中使用,用戶知道這些連續更新,最重要的是,他們需要這些更新 – Apperside 2013-05-13 12:38:06

+0

他們的設備將基本上無法使用,除非它們頻繁插入。移動設備CPU並不意味着運行不斷。 – CommonsWare 2013-05-13 12:44:52

回答

0

在真實環境,這些更新將每10分鐘或更長時間,在我的測試中,我'm使用10秒

這樣更合理。

如果這些是我的要求,你有什麼建議?

刪除所有現有的代碼。

然後,設置AlarmManagerELAPSED_REALTIME_WAKEUP事件,綁在BroadcastReceiver,要麼my WakefulIntentService或您自己的IntentService/WakeLock邏輯。您需要這種組合才能滿足您的「即使設備處於待機狀態也能處於活動狀態」的要求。

+0

你爲什麼建議ELAPSED_REALTIME_WAKEUP?它不是用於與系統啓動時間綁定的事件嗎?我更新的邏輯是:應用程序啓動,十分鐘後安排更新,並在十分鐘後再次安排更新。爲了實現這樣的邏輯,是不是更好的RTC_WAKEUP?其他問題:警報管理器比定時器更可靠嗎? – Apperside 2013-05-13 13:29:59

+0

@SimonVeloper:「你爲什麼建議ELAPSED_REALTIME_WAKEUP?」 - 當您需要將警報與某人的日曆綁定時(例如,必須在下週二10:00在使用者提醒他們的牙醫預約時),才使用「RTC」/「RTC_WAKEUP」。除此之外,'ELAPSED_REALTIME' /'ELAPSED_REALTIME_WAKEUP'更具彈性。 「不是更好的RTC_WAKEUP?」 - 沒有。 「報警管理器比定時器更可靠嗎?」 - 如果我不得不猜測,你的'Timer'問題是設備在CPU關閉時進入「待機」狀態。 'AlarmManager'適用於「待機」,'定時器'不適用。 – CommonsWare 2013-05-13 13:52:20

+0

即使在按Home鍵(暫停應用程序)並按下開/關按鈕(將手機置於睡眠模式)之後,我仍然可以看到計時器被觸發。這怎麼可能? – Apperside 2013-05-13 14:37:47