Я пишу приложение, которое динамически создает аудиоплееры.Нажав кнопку, я хочу, чтобы все обработчики останавливались и запускались снова, когда я их вызываю.Обработчики, в основном, отвечают за обновление панели поиска аудиоплеера.панель поиска и кнопка воспроизведения превращаются в линейный макет, и этот линейный макет добавляется в родительский линейный макет.таким образом, например, если я по коду принимаю решение создать 4 аудиопроигрывателя и хочу, чтобы они могли воспроизводить звук вместе, я зациклил создание 4 линейных разложений и добавил их в родительский линейный разметка.код более или менее выглядит следующим образом (это только соответствующая часть, а не реальный код ...):
for (int i = 0; i < 4; i++)
{
LinearLayout audioLayout = new LinearLayout(this);
audioLayout.setOrientation(LinearLayout.HORIZONTAL);
audioLayout.setPadding(20, 20, 20, 20);
final Button btnAudioPlay = new Button(this);
btnAudioPlay.setBackgroundResource(R.drawable.play);
LinearLayout.LayoutParams playButtonParams = new LinearLayout.LayoutParams(50, 50);
playButtonParams.setMargins(20, 0, 20, 0);
audioLayout.addView(btnAudioPlay, playButtonParams);
final SeekBar sbAudioPosition = new SeekBar(this);
LinearLayout.LayoutParams seekbarParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
seekbarParams.setMargins(20, 0, 20, 0);
audioLayout.addView(sbAudioPosition, seekbarParams);
parentLayout.addView(audioLayout);
final MediaPlayer mpAudio = MediaPlayer.create(this, Uri.fromFile(audFile));
mpAudio.setLooping(false);
mpAudio.seekTo(0);
int totalTime = mpAudio.getDuration();
sbAudioPosition.setMax(totalTime);
sbAudioPosition.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener()
{
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
{
if (fromUser)
{
mpAudio.seekTo(progress);
sbAudioPosition.setProgress(progress);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {}
});
mpAudio.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
btnAudioPlay.setBackgroundResource(R.drawable.play);
sbAudioPosition.setProgress(0);
}
});
btnAudioPlay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (!mpAudio.isPlaying()) {
mpAudio.start();
btnAudioPlay.setBackgroundResource(R.drawable.pause);
final Handler handler = new Handler();
runOnUiThread(new Runnable() {
@Override
public void run() {
sbAudioPosition.setMax((int) mpAudio.getDuration());
int currentPossition = mpAudio.getCurrentPosition();
sbAudioPosition.setProgress(currentPossition);
handler.postDelayed(this, 0);
}
});
}
else {
mpAudio.pause();
btnAudioPlay.setBackgroundResource(R.drawable.play);
}
}
});
}
Когда я нажимаю кнопку, я обновляю представление и хочувсе обработчики остановить, но этого не происходит ... Я пытался объявить, перед тем как onCreate обработчик обработчик = null;(вместо окончательного обработчика), а затем в linearlayout сделайте его новым, и это сработало, но в методе кнопки я вызвал handler.removeCallbacksAndMessages (null);и это не сработало.Я также попытался объявить runable и вызвать handler.removeCallbacks (runOnUiThread) ;, но мое приложение вылетает ...: (
Что мне нужно сделать, чтобы решить эту проблему? Если я хочу, чтобы воспроизводился один звукостановит воспроизведение текущего аудио, возможно ли это? решит ли это мою проблему?
Извините за длину и спасибо за помощников.:)