Как остановить все обработчики, работающие в фоновом режиме? - PullRequest
0 голосов
/ 22 октября 2018

Я пишу приложение, которое динамически создает аудиоплееры.Нажав кнопку, я хочу, чтобы все обработчики останавливались и запускались снова, когда я их вызываю.Обработчики, в основном, отвечают за обновление панели поиска аудиоплеера.панель поиска и кнопка воспроизведения превращаются в линейный макет, и этот линейный макет добавляется в родительский линейный макет.таким образом, например, если я по коду принимаю решение создать 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) ;, но мое приложение вылетает ...: (

Что мне нужно сделать, чтобы решить эту проблему? Если я хочу, чтобы воспроизводился один звукостановит воспроизведение текущего аудио, возможно ли это? решит ли это мою проблему?

Извините за длину и спасибо за помощников.:)

1 Ответ

0 голосов
/ 22 октября 2018

Вы можете использовать Handler в качестве члена вашего Activity что-то вроде:

private Handler mHandler = new Handler();
private Runnable mRunnable = new Runnable() {
                @Override
                public void run() {
                    sbAudioPosition.setMax((int) mpAudio.getDuration());
                    int currentPossition = mpAudio.getCurrentPosition();
                    sbAudioPosition.setProgress(currentPossition);
                    mHandler.post(this);
                }
            };

Затем используйте mHandler, когда выполняете команду execute mHandler.postDelayed(runnable,delay).И тогда вы можете позвонить mHandler.removeCallbacks(null);, когда вы хотите удалить их всех.

Примечание : Вы можете удалить определенные runnables, например так: mHandler.removeCallbacks(mRunnable);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...