2013-09-22 3 views
0

function play() 내 for 루프를 사용하여 일부 사운드 재생을 시작하고 중지 할 때 동일한 버튼을 사용하고 싶습니다. 잠금 변수를 사용하여이 작업을 수행하는 것으로 생각했지만, 함수 재생 종료가 끝날 때까지 클릭 한 상태를 유지합니다. 몇 가지 해결책을 제안 할 수 있습니까? 이 문제를 play() 내부 try {Thread.sleep(1000);입니다버튼을 누른 채로 메서드가 끝날 때까지 계속됩니다.

public class MainActivity extends Activity { 
    private static SoundPool sound; 
    static int lock=1; 
    int s; 

    @Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    sound=new SoundPool(20, AudioManager.STREAM_MUSIC, 100); 
    s=sound.load(this,R.raw.bipsound, 0); 
    Button button = (Button) findViewById(R.id.button); 

} 
public void onClick(View v) { 
    switch(lock) { 
     case 0: 
      lock=1; 
      break; 

     case 1: 
      lock=0; 
      play(); 
      break; 
    } 
} 

public void play(){ 
    for(int i=0;i<10;i++){ 
     sound.play(s,1.0f, 1.0f, 1, 0, 1); 
     if(lock==1) 
      return; 
     try {Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

} 

답변

1

:

는이 같은 상황이있다. 거의 항상 나쁜 생각 인 주 Threadsleep에게 말하고 있습니다. Button은 눌려져 sleep() 시간이 끝날 때까지 그 상태를 유지합니다.

해당 행을 제거하십시오. 그리고 거기서 성취하려고하는 것이 확실하지 않지만 TimerTask과 같은 것을 사용하여 Thread을 별도로 실행하면 handler 또는 기타 기능을 사용할 수 있습니다. 더 많은 도움이 필요하면 그걸로 무엇을 하려는지 설명하십시오.

0

try {Thread.sleep(1000);을 사용 중이며 1 초 동안 기본 스레드를 중지하기 때문에 정상입니다.

당신은

여기 예입니다 : 그렇게하기 위해 AsyncTask를를 사용했습니다.

private void goToMainActivity() { 
     new AsyncTask<Void, Void, Void>() { 

      @Override 
      protected Void doInBackground(Void... params) { 
       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       return null; 
      } 

      @Override 
      protected void onPostExecute(Void result) { 
       super.onPostExecute(result); 
       Intent intent = new Intent(fa, Main.class); 
       startActivity(intent); 
      } 
     }.execute(); 
    } 
관련 문제