0

我想使用同一个按钮来开始和停止播放一些声音,并在函数 play() 中使用 for 循环。我想使用锁定变量来执行此操作,但单击后的按钮保持按下状态,直到功能播放结束执行。你能提出一些解决方案吗?

我有这样的情况:

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();
        }
    }
}

}
4

2 回答 2

1

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

删除该行。而且我不确定您要在那里完成什么,但您可以单独运行它ThreadTimerTask使用 ,handler或其他此类功能。如果您需要更多帮助,请解释您正在尝试做什么。

于 2013-09-22T15:28:10.107 回答
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();
    }
于 2013-09-22T15:28:33.187 回答