2014-02-05 38 views
0

我使用postDelayed來延遲動態持續時間。 我發現它無法正常工作。 這是我的源代碼。PostDelayed無法正常工作

public Runnable service = new Runnable() { 
     public void run() {  
      endTimeHere = System.currentTimeMillis(); 
      Log.d("Time",(endTimeHere-startTimeHere)/1000); 
      switch (step) 
      { 
       case 0: 
        delay = 0; 
        step = 1; 
        break; 
       case 1: 
        delay = 600;  //delay 10 min = 600 sec 
        step = 2; 
        break; 

       case 2:  
        delay = 1200; //delay 20 min = 1200 sec 
        step = 3; 
        break; 
       case 3:  
        delay = 1800; //delay 30 min = 1800 secs 
        step = 0; 
        break; 
       default: 
        break; 
      } 
      startTimeHere = System.currentTimeMillis(); 
      handler.postDelayed(service, delay*1000); 
     } 
    }; 

而且我在BroadcastLintener中啓動和停止處理程序。

public Handler handler = new Handler();  
private BroadcastReceiver screenReceiver = new BroadcastReceiver() 
    { 
     public void onReceive(Context context, Intent intent) 
     { 
      String action = intent.getAction(); 
      if(Intent.ACTION_SCREEN_ON.equals(action)) 
      { 
       handler.removeCallbacks(service); 
      } 
      else if(Intent.ACTION_SCREEN_OFF.equals(action)) 
      { 
       handler.post(service); 
      } 
     } 
    } 

我確定postDelayed是在隊列中添加的,因爲返回值爲true。 但是,我記錄的持續時間與我設置的延遲值不匹配。例如,我設置延遲= 600秒,記錄的持續時間= 958秒。

有誰知道爲什麼會發生這種情況?

+1

你是否嘗試過使用部分喚醒鎖的代碼? – marcinj

+0

不是。那是相關的嗎? – iscnorthwind

+1

值得嘗試,你的設備migt在ACTION_SCREEN_OFF – marcinj

回答

0

處理程序並不完美,當他們應該發射。其他線程(如UI線程)可能優先。另外,Android有處理Intent的開銷。換句話說,由於操作系統的線程監視延遲,處理程序可能會在650毫秒的時間內觸發,但之後需要處理意圖,實例化接收器,處理意圖等。

您可能會更好地發送意圖與延遲數據,然後讓服務建立一個隊列並根據預期的延遲頻繁地進行輪詢。例如預計未來500毫秒的事件應該每隔50毫秒輪詢一次,以查看延遲時間是否已過期。雖然未來的10,000毫秒事件可以在5,000毫秒或9,000毫秒內進行輪詢,然後隨着時間的推移增加輪詢頻率。