2014-10-09 71 views
0
 RefreshHandler refreshHandler = new RefreshHandler(); 
     class RefreshHandler extends Handler{ 
     @Override 
     public void handleMessage(Message msg) { 
        Level1.this.updateUI(); 
       } 
     public void sleep(long delayMillis){ 
           this.removeMessages(0); 
     sendMessageDelayed(obtainMessage(0), delayMillis); 
       } 
     }; 
     public void updateUI(){ 

     if(i<=imgid.length){ 
     refreshHandler.sleep(100); 

     if(i<imgid.length){ 
      imageView.setImageResource(imgid[i]); 
      imageView.setBackgroundColor(Color.WHITE); 
     } else if (i>=imgid.length) { 
      i = 0; 
      imageView.setImageResource(imgid[i]); 
     } 
     i++; 

該循環工作正常,圖像幻燈片持續進行。 當我點擊後退按鈕並開始一個不同的活動時,logcat不停地寫信息,告訴我線程一直在後臺運行。 我該如何阻止? 我是編程新手,請不要對我苛刻,謝謝。我在Android中循環ImageView幻燈片後,線程繼續在後臺運行?

回答

0

基本上,你需要一種方法來知道是否要打電話給你RefreshHandler的睡眠方法(這是繼續在「循環」。)

您可以在活動中使用的布爾成員變量和比分扳成到您的Activity的onPause()/ onResume()生命週期回調,以幫助您知道是否繼續放映幻燈片。

此外,你應該小心,不要讓你的RefreshHandler靜態的(如果它的一個內部類),並持有到一個WeakReference的你的1級活動泄漏你的1級活動

看一看這個優秀的文章就從一個處理程序問題由亞歷克斯·洛克伍德這裏泄漏的活動:

http://www.androiddesignpatterns.com/2013/01/inner-class-handler-memory-leak.html

嘗試是這樣的:

public class Level1 extends Activity 
{ 
    public static class RefreshHandler extends Handler 
    { 
     private WeakReference<Level1> level1Ref; 

     public RefreshHandler(Level1 level1) 
     { 
      super(); 
      level1Ref = new WeakReference<Level1>(level1); 
     } 

     @Override 
     public void handleMessage(Message msg) 
     { 
      Level1 level1 = level1Ref.get(); 

      if (level1 != null) 
      { 
       level1.updateUI(); 
      } 
     } 

     public void sleep(long delayMillis) 
     { 
      this.removeMessages(0); 
      sendMessageDelayed(obtainMessage(0), delayMillis); 
     } 
    }; 

    private boolean slideshowRunning = false; 
    private RefreshHandler refreshHandler = new RefreshHandler(this); 

    public void updateUI() 
    { 
     if (slideshowRunning) 
     { 
      // call refreshHandler.sleep 
     } 
    } 

    @Override 
    public void onResume() 
    { 
     super.onResume(); 
     slideshowRunning = true; 
    } 

    @Override 
    public void onPause() 
    { 
     super.onPause(); 
     slideshowRunning = false; 
    } 
} 
+0

邁克爾喜。請看看我添加的代碼。我搞不清楚了。 – user3814312 2014-10-09 19:53:55

+0

嗨邁克爾。我已經把整個代碼,現在我只是想讓它工作。然後我會試着去理解它。現在它不工作,因爲顯然缺少某些東西。感謝您的幫助!!! – user3814312 2014-10-10 02:49:52