2017-09-14 23 views
0

참고 : 이것은 모두 내 AppWidgetProvider의 updateAppWidget()에 있습니다."looping"postDelayed()와 같은 문제가 있습니까?

저는 위젯이 영원히 2 가지 색상으로 앞뒤로 깜박이도록하려고합니다. 이것은 지연된 runnables가 다른 지연된 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에서 핸들러에서 모든 실행 파일을 제거했는지 확인해야합니다. 그렇지 않으면 메모리 누출이 발생할 수 있습니다 (기본적으로 루프를 종료해야 함). 그러나 일반적인 패턴이 표준입니다.