2011-05-16 57 views
3

我正在使用handler.postDelayed方法爲某些動畫內容創建一些延遲。Handler.postdelayed

因爲我在用Mediaplayer播放一些歌曲。用戶可以通過單擊下一步退出此操作類。但在下一個屏幕上,即使我在下一個按鈕的onclicklistener中調用stop方法,同一首歌曲仍在繼續。

這是由於添加的時間延遲,在下一個活動加載後執行。任何想法?

handler.postDelayed(new Runnable() { 
     public void run() { 
      mp = MediaPlayer.create(getApplicationContext(), R.raw.num2); 
      mp.start(); 
      imageView1.setImageResource(R.drawable.countcat2); 
     } 
    }, 2000); 

回答

2

你加一個Log,看是否run()被調用?我會假設你的處理程序被取消註冊;畢竟,postDelayed將等待,直到再次踢人。

我假設你的動畫比那2000ms更快?在你的活動結束後,你將無法讓你的處理程序調用,它正在訪問imageView1,我認爲它在onDestroy中被銷燬。

你可以考慮增加一個標誌,該標誌將強制執行該操作將在onDestroy立即打電話,和/或你可以使用一個Timer。在定時器的情況下,請確保在銷燬後不要使用類似imageView1的東西。

+0

doh!國旗很簡單。我很尷尬。謝謝 :) – nasaa 2011-05-16 18:52:50

0

使用線程。然後用中斷停止:

Public Thread getThread(final Handler handle, int delay) 
{ 
    return new Thread() 
    { 
    @Override 
    public void run() 
    { 
     try 
     { 
     synchronized(this) 
     { 
      Thread.sleep(delay);  
      handle.post(new Runnable() 
      {  
      @Override 
      public void run() 
      {  
       "the code to be exec." 
      } 
      }); 

     }  
    } 
     catch(Exception e) 
     { 
    e.printStackTrace(); 
     } 
    }; 
    }; 
} 

或者你可以使用使用postDelayed功能

Public Thread getThread(final Handler handle, int delay) 
{ 
    return new Thread() 
    { 
    @Override 
    public void run() 
    { 
     try 
     { 
     synchronized(this) 
     { 
      handle.postDelayed(new Runnable() 
      {  
      @Override 
      public void run() 
      {  
       "the code to be exec." 
      } 
      }, delay); 

     }  
    } 
     catch(Exception e) 
     { 
    e.printStackTrace(); 
     } 
    }; 
    }; 
} 

你會發現,有這兩種方法之間的差別不大。要打斷它,請做這樣的事情:

Thread t = getThread(handle, delay); 
    t.start(); 
    if(t != null) 
    { 
    if (t.isAlive()) 
    { 
    t.interrupt(); 
    } 
} 

希望我幫了忙。

相關問題