2012-11-30 51 views
0

我想要做的是運行一種方法,在ToggleButton處於打開狀態時從我的資源播放隨機聲音。然後在ToggleButton關閉時停止。問題是,按照目前的構建,我的代碼與UI線程鎖定。我以爲我正確使用AsyncTask,但顯然不是。Android ToggleButton - 在不鎖定UI線程的情況下啓用某些功能

你能提出一個解決這個或更好的方法來完成我想要的?

public void onToggleClicked(View view) { 
    // Is the toggle on? 
    boolean on = ((ToggleButton) view).isChecked(); 



    while (on) { 

     AssetManager assetMgr = this.getAssets(); 
     try { 
      String[] filename = assetMgr.list("sounds"); 
      Random r = new Random(); 
      String fn = filename[r.nextInt(filename.length)]; 
      if (MyService.mp.isPlaying()) { 

      } 
      else { 

       new PlayShuffleMode().execute(fn); 

     } 


     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

這裏是的AsyncTask方法:

private class PlayShuffleMode extends AsyncTask<String, Void, Void> { 

    @Override 
    protected Void doInBackground(String... fn) { 

     mService.playfav(fn[0]); 
     return null; 
    } 
} 

回答

1

的問題是你的while循環。 while循環將在主線程上持續循環,直到您切換按鈕,但由於while循環位於主線程中,因此您的UI將被鎖定。所以你必須想辦法將while循環移入你的AsyncTask。

一個建議:爲什麼不做AsyncTask在while循環中,反而在AsycTask中有while循環?類似...

private playShuffle; 

public void onToggleClicked(View view) { 
    ToggleButton tb = ((ToggleButton) view); 
    tb.setChecked(!tb.isChecked()); // Toggle the state. 

    if(tb.isChecked()) { 
    playShuffle = new PlayShuffleMode(); 
    playShuffle.execute(); 
    } 
    else { 
    playShuffle.cancel(); 
    } 
} 
+0

如何從AsyncTask中檢查ToggleButton是否仍然打開?上面的代碼只需運行一次AsyncTask(打開切換按鈕後)。 – explosivo

+0

謝謝。這讓我朝着正確的方向前進。目前,我無法弄清楚如何從AsyncTask中檢查ToggleButton的狀態。看起來我需要傳遞狀態,也許我可以在onPostExecute()方法中檢查它。 – explosivo

+0

您不必檢查AsyncTask中的狀態。當你點擊切換按鈕'onToggleClicked()'時會調用並檢查ToggleButton的狀態。如果它打開,創建AsyncTask,緩存它並執行它。它會一直播放,直到再次按下onToggleClicked()。如果狀態爲關閉狀態,請使用緩存的AsyncTask並調用'cancel()'取消將結束播放的任務。我編輯了上面的代碼,使其更加清晰。 –

相關問題