на значке кнопки воспроизведения Android не изменится, пока песня не будет полностью воспроизведена

1

У меня есть кнопка изображения, которая удваивается как кнопка воспроизведения и остановки. Мне нужно изображение в кнопке, чтобы изменить, когда пользователь нажимает на него в первый раз, так что теперь он выглядит как кнопка остановки. Но этого не произойдет, пока нить не завершит воспроизведение песни.

ImageButton Sound;
public void onClick(View v) {
    selectRandomSong();
    Sound.setBackgroundResource(R.drawable.stop);
    v.invalidate();
    if(playing)
        stop();
    else
        play();
    Sound.setBackgroundResource(R.drawable.play);
}

setBackground не будет отражать взгляд, поскольку недействительность не возникает. Где и как я могу сделать это недействительным?

  • 0
    какой у тебя "звук"? если это кнопка, вы должны использовать ссылку view v вместо того, чтобы устанавливать фоновую ссылку на один раз и лишать законной силы другую ...
  • 0
    Звук - это его / ее ImageButton как раз над частью кода
Показать ещё 3 комментария
Теги:

1 ответ

1
Лучший ответ

Я не уверен, как реализованы функции stop() и play(), но на основе вашего описания кажется, что они блокируют поток пользовательского интерфейса, так что фон кнопки никогда не изменяется. Выполнение этих функций в отдельном потоке решило бы проблему блокировки, но вам разрешено обновлять фоновый ресурс в потоке пользовательского интерфейса. Чтобы обойти эту проблему, вы можете использовать вызов Activity.runOnUiThread().

Этот код не является потокобезопасным (и он не проверен), но должен дать вам хорошую отправную точку.

ImageButton Sound;
public void onClick(View v) {

    //Kick off a new thread to play the song without blocking the UI thread
    Thread playSongThread = new Thread() {
        public void run() {
            selectRandomSong();
            setBackgroundResource(R.drawable.stop);
            //v.invalidate(); //shouldn't be neccessary
            if(playing)
                stop();
            else
                play();
            setBackgroundResource(R.drawable.play);
        }       
    };      
    playSongThread.start();
}

/**
 * Sets the background resource using the UI thread
 * @param id Resource ID to set the background to
 */
private void setBackgroundResource(final int id)
{
    this.runOnUiThread(new Runnable()
    {
        public void run()
        {
            Sound.setBackgroundResource(id);                
        }
    });
}
  • 0
    Ты сделал это!!! Это работает как шарм ... но не могли бы вы пояснить, почему этот код небезопасен?
  • 0
    Поскольку это многопоточность, один поток может принять решение, основываясь на логическом «воспроизведении» непосредственно перед тем, как другой поток изменит этот логический. Из-за этого вы можете увидеть странное поведение, если пользователь нажимает кнопку несколько раз подряд.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню