2015-02-09 70 views
0

我試圖連續動畫4個圖像,當我收到發送廣播意圖的新GCM消息時切換動畫。我將顯示前兩個代碼,以及出錯的地方。基本上這兩個命令之間(情況0與情況1),我需要能夠停止第一個runnable,然後開始第二個。我試圖通過設置在Android中處理多個Runnables()

isRunning = false; 

但這不起作用。我在想,如果我繼續黑客攻擊,我可能會得到這個權利,但我想知道正確的方法是什麼。

public void startAnimatedBackground(Integer num) { 
    isRunning = false; 
    ImageSwitcher imageSwitcher = null; 
    aniIn = AnimationUtils.loadAnimation(this, 
      android.R.anim.fade_in); 
    aniOut = AnimationUtils.loadAnimation(this, 
      android.R.anim.fade_out); 

    aniIn.setDuration(500); 
    aniOut.setDuration(500); 
    switch (num) { 
     case 0: 
      imageSwitcher = (ImageSwitcher) findViewById(R.id.switcher_accept); 
      break; 
     case 1: 
      imageSwitcher = (ImageSwitcher) findViewById(R.id.switcher_on_way); 
      break; 
     default: 
      break; 
    } 
    imageSwitcher.setInAnimation(aniIn); 
    imageSwitcher.setOutAnimation(aniOut); 
    imageSwitcher.setFactory(this); 
    imageSwitcher.setImageResource(images[0]); 
    isRunning = true; 
    final Handler handler = new Handler(); 
    final ImageSwitcher finalImageSwitcher = imageSwitcher; 
    Runnable runnable = new Runnable() { 

     @Override 
     public void run() { 
      if (isRunning) { 
       System.out.println("Running.."+finalImageSwitcher+index); 
       index++; 
       index = index % images.length; 
       finalImageSwitcher.setImageResource(images[index]); 
       handler.postDelayed(this, interval); 
      } 
     } 
    }; 
    handler.postDelayed(runnable, interval); 

} 

這是首先發生的事情,它是正確的。我得到一個閃爍的圖像。

...應用程式:ID/switcher_accept} 1 ...應用程式:ID/switcher_accept} 0 ...應用程式:ID/switcher_accept} 1 ...應用程式:ID/switcher_accept} 0 ... app:id/switcher_accept} 1

案例2運行後,這就是運行過程的樣子。正如你所看到的,兩者都在運行,並沒有發生預期的行爲。我想要的是第二個(switcher_on_way)像第一個那樣運行。我希望我的運行=假;代碼會讓這發生,但它顯然不是。

...應用程式:ID/switcher_on_way} 0 ...應用程式:ID/switcher_accept} 1 ...應用程式:ID/switcher_on_way} 0 ...應用程式:ID/switcher_accept} 1 ...應用:ID/switcher_on_way} 0 ...應用:ID/switcher_accept} 1

回答

1

你的問題就出在這一塊:

Runnable runnable = new Runnable() { 

    @Override 
    public void run() { 
     if (isRunning) { 
      System.out.println("Running.."+finalImageSwitcher+index); 
      ... 
      handler.postDelayed(this, interval); 
     } 
    } 
}; 
handler.postDelayed(runnable, interval); 

您試圖創建一個循環,並控制它通過isRunning變量。但是,問題是在interval中檢查isRunningtrue的條件。

1: Start _isRunning=false______Check(isRunning)________Check(isRunning) 
2: ___Start _isRunning=false___isRunning=true_______isRunning=true 

,你需要其他的方法,例如:創建全局handler而不是本地然後取消postDelayed當你開始一個新的動畫。 參考:cancelling a handler.postdelayed process

,或者您可以使用wait,​​和notify

+0

完美,謝謝! – user1610719 2015-02-09 22:52:50