2013-09-22 34 views
0

我想使用相同的按钮来启动和停止播放一些for循环内函数play()。 我以为使用锁定变量来做到这一点,但点击后按钮仍然按下,直到功能播放结束执行。 你能提出一些解决方案吗?单击按钮后按钮直到方法结束

我有这样的情况:

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

这是一个问题try {Thread.sleep(1000);play()。您正在告诉主要Threadsleep这几乎总是一个坏主意。 Button被按下并保持该状态,直到sleep()时间结束。

删除该行。我不确定你在那里试图完成什么,但是你可以在单独的Thread中运行它,例如TimerTask,使用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(); 
    }