2012-11-30 3 views
0

ToggleButton이 켜져있는 동안 내 애셋에서 임의의 사운드를 재생하는 메소드를 실행하고 싶습니다. ToggleButton이 꺼져있을 때 중지하십시오. 문제는 현재 구축 된 것처럼 내 코드가 UI 스레드로 잠겨 있다는 것입니다. 나는 AsyncTask를 올바르게 사용하고 있다고 생각했지만 분명히 그렇지는 않다.Android ToggleButton - UI 스레드를 잠그지 않고 사용할 때 수행 무비

내가 원하는 것을 달성하기 위해이 방법이나 더 나은 방법을 제안 할 수 있습니까?

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

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

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

답변

1

문제는 당신 while 루프 : 여기

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를 방법입니다. 버튼을 토글 할 때까지 while 루프가 메인 스레드에서 계속 반복되지만, while 루프가 메인 스레드에 있으므로 UI가 잠길 수 있습니다. 따라서 while 루프를 AsyncTask로 이동하는 방법을 찾아야합니다.

하나의 제안 : while 루프 내부에 AsyncTask를 갖는 대신, 역수를 수행하고 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

어떻게 ToggleButton이 AsyncTask에서 계속 켜져 있는지 확인할 수 있습니까? 위의 코드는 토글 버튼을 켠 후에 AsyncTask를 한 번만 실행합니다. – explosivo

+0

감사. 이것은 나를 올바른 방향으로 인도하고 있습니다. 현재 AsyncTask 내부에서 ToggleButton의 상태를 확인하는 방법을 알 수 없습니다. 상태를 전달해야 할 것 같아서 onPostExecute() 메소드에서 확인할 수 있습니다. – explosivo

+0

AsyncTask에서 상태를 확인하지 않아도됩니다. 토글 버튼을 클릭하면 onToggleClicked()가 호출되고 ToggleButton의 상태를 검사합니다. 켜져 있으면 AsyncTask를 만들어 캐시하고 실행하십시오. 'onToggleClicked()'가 다시 눌러 질 때까지 영원히 계속 재생됩니다. 상태가 꺼져 있으면 캐시 된 AsyncTask를 가져 와서 'cancel()'을 호출하여 재생을 종료 할 작업을 취소합니다. 위 코드를 더 명확하게 편집했습니다. –

관련 문제