2017-09-14 242 views
0

注意:這全部在我的AppWidgetProvider的updateAppWidget()中。像這樣「循環」postDelayed()會發生什麼問題嗎?

我試圖讓我的小部件永遠在兩種顏色之間來回閃爍。這是通過讓延遲的runnable發佈另一個延遲可運行的處理程序來完成的,該處理程序本身發佈另一個......等等。但是這樣做會有潛在的內存問題嗎?該小部件運行沒有問題,但幾小時後,它有可能會凍結或開始不規律地閃爍。這些症狀顯然是因爲我的實施? (主要在postDelayed()中使用「this」)

final int blinkDelay = 1000; 
final Handler myHandler = new Handler(); 
final Runnable runnable = new Runnable() { 
    boolean lightOn = true; 
    public void run() { 
     if (lightOn){ 
      lightOn = false; 
      views.setInt(R.id.RelativeLayout1, "setBackgroundColor", Color.argb(150, 255, 248, 231)); //turn light "off" 
      appWidgetManager.updateAppWidget(appWidgetId, views); 
      myHandler.postDelayed(this, blinkDelay); 
     } else{ 
      lightOn = true; 
      views.setInt(R.id.RelativeLayout1, "setBackgroundColor", Color.argb(220, 255, 248, 231)); //turn light "on" 
      appWidgetManager.updateAppWidget(appWidgetId, views); 
      myHandler.postDelayed(this, blinkDelay); 
     } 
    } 
}; 

//start the blink loop 
myHandler.post(runnable); 

其餘的重寫方法不變。

回答

0

你需要確保在onDestroy中你從處理程序中刪除了所有的runnables,否則你可能導致內存泄漏(基本上你需要確保它最終結束循環)。但是這種一般模式是標準的。

相關問題