У меня есть кнопка изображения, которая удваивается как кнопка воспроизведения и остановки. Мне нужно изображение в кнопке, чтобы изменить, когда пользователь нажимает на него в первый раз, так что теперь он выглядит как кнопка остановки. Но этого не произойдет, пока нить не завершит воспроизведение песни.
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
не будет отражать взгляд, поскольку недействительность не возникает. Где и как я могу сделать это недействительным?
Я не уверен, как реализованы функции 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);
}
});
}