2011-02-19 97 views
1

我遇到了wakelocks問題。基本上,我在我的計時器線程中運行了wakelock,在我的應用程序的整個持續時間內(這是一個用於進行性能測量的後臺應用程序),它是一個AsyncTask的doInBackground。然後我決定我只想讓屏幕每隔10分鐘左右醒來一秒鐘左右。所以我創建了另一個擴展AsyncTask的類,並將下面的代碼放到它的doInBackground中,但是現在屏幕並沒有打開。我應該注意到,我使用onCreate的doInBackground方法啓動此線程和另外兩個AsyncTask線程。Android - Wakelock線程沒有打開屏幕

這裏是我的新內部類進行喚醒:基本上它應該做的就是每隔10分鐘喚醒一次電話屏幕,直到我的其他兩個後臺線程設置其布爾值爲真。

private class WakeUp extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected Void doInBackground(Void... arg0) { 

     PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
     PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, getClass().getName()); 

     do{ 
      try { 
       Thread.sleep(WAKEUP_EVERY); //600000ms 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      }   

      wl.acquire(); 

      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 

      wl.release(); 

     }while(!timeCompleted || !transferCompleted); 

     return null; 
    } 

} 
+0

確定線程沒有被殺死?您可能需要爲此服務或AlarmService使用服務,以便每10分鐘產生一次脈衝。由於AsyncTask在您的應用程序的Threadpool上運行,因此線程池可能會在線程執行時發生超時。 –

+0

@Greg我剛剛在獲取wakelock和一個右鍵之前剛剛添加了一個日誌語句,然後釋放它以查看踩點是否還活着。這些語句顯示在adb中,但屏幕無法啓動,所以看起來線程處於活動狀態,但waklock未按預期運行。我會研究Service/AlarmService,看看有沒有什麼可嘗試的。 – Michael

+0

OH,您是否添加了此標誌ACQUIRE_CAUSES_WAKEUP。如果你想讓屏幕打開,我相信你必須添加該標誌,PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP –

回答

2

您忘記了使用ACQUIRE_CAUSES_WAKEUP標誌告訴喚醒鎖打開屏幕。根據文檔:

正常喚醒鎖並不實際打開照明。相反,它們會導致照明在打開後(例如,來自用戶活動)保持打開狀態。當WakeLock被採集時,該標誌將強制屏幕和/或鍵盤立即打開。一個典型的用途是對於用戶立即看到的重要通知。

詳情請參閱ACQUIRE_CAUSES_WAKEUP:d

相關問題