如果切换按钮,每秒钟都需要播放声音

时间:2018-01-20 23:42:17

标签: java android

我有一个切换按钮,我需要' mp'如果该按钮被切换,则每秒播放声音。下面的代码是我尝试的,它确实每秒播放声音,但按钮停止响应,所以我无法将其关闭。

    ToggleButton btn = findViewById(R.id.button);
    final MediaPlayer mp  = MediaPlayer.create(this, R.raw.beat);

    btn.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
            while (isChecked) {
                mp.start();
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    });

提前谢谢。

2 个答案:

答案 0 :(得分:0)

永远不要使用Thread.sleep(1000)这是你可以对应用程序做的可怕的事情。你的应用不是       因为您正在将应用程序的主线程置于睡眠状态。

我为你创建了这个类来进行演示。你可以进一步调整你的需求。

  private Handler soundHandler = new Handler();
  private int delay = 1000;
  private Runnable soundRunnable;
  private MediaPlayer mediaPlayer;
  private boolean isToggleChecked;

  @Override protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ToggleButton toggleButton = findViewById(R.id.button);
    mediaPlayer = MediaPlayer.create(this, R.raw.beat);

    toggleButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
      @Override public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked){
        isToggleChecked = isChecked;
        if(isChecked){
          playSound();
        }else {
          stopSound();
        }
      }
    });
  }

  @Override protected void onResume(){
    super.onResume();
    if(isToggleChecked){
      playSound();
    }
  }

  // this will make sure sound stops when app stops or goes in background
  @Override
  protected void onPause() {
    soundHandler.removeCallbacks(soundRunnable);
    super.onPause();
  }

  private void playSound(){
    soundHandler.postDelayed(new Runnable() {
      public void run() {
        soundRunnable = this;
        if(mediaPlayer != null) {
          mediaPlayer.start();
        }
        soundHandler.postDelayed(soundRunnable, delay);
      }
    }, delay);
  }

  private void stopSound(){
    if(mediaPlayer != null){
      if(mediaPlayer.isPlaying()){
        mediaPlayer.stop();
        soundHandler.removeCallbacks(soundRunnable);
      }
    }
  }

答案 1 :(得分:0)

我找到了另一个问题的答案并对其进行了修改以符合我的需求,现在它完美无缺。这就是解决方案/代码。

public class MainActivity extends AppCompatActivity {

MediaPlayer mediaPlayer = null;
int delayMillis;
Handler handler;
Runnable runnable;
private boolean isToggleChecked;
private ToggleButton toggleButton;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    toggleButton = findViewById(R.id.button);

    handler = new Handler();
    runnable = new Runnable() {
        @Override
        public void run() {
            mediaPlayer.start();

        }
    };


    toggleButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (isChecked) {
                isToggleChecked = true;
                toggleMediaPlayer();
            }
            else {
                mediaPlayer.stop();
                mediaPlayer.release();
                mediaPlayer=null;
                handler.removeCallbacks(runnable);
                isToggleChecked = false;
            }
        }
    });
}

@Override
public void onResume() {
    super.onResume();
    if (isToggleChecked) {
        toggleButton.setChecked(true);
    }
    else {
        toggleButton.setChecked(false);
    }
}

private void toggleMediaPlayer(){
    if(mediaPlayer != null){
        mediaPlayer.stop();
        mediaPlayer.release();
        mediaPlayer=null;
        handler.removeCallbacks(runnable);
    }else{
        mediaPlayer = MediaPlayer.create(this, R.raw.beat);
        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                mp.start();
            }
        });

        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                delayMillis = 1000;
                handler.postDelayed(runnable,delayMillis);
            }
        });

    }
}
}