我有一个图像按钮,可以兼作播放和停止按钮。当用户第一次点击按钮时,我需要更改按钮中的图像,以便它现在看起来像一个停止按钮。但是直到线程完成播放歌曲才会发生这种情况。
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 :(得分:1)
我不确定如何实现stop()和play(),但根据你的描述,它听起来像是阻止了UI线程,因此按钮背景永远不会改变。在单独的线程中运行这些函数可以解决阻塞问题,但只允许更新UI线程上的后台资源。为了解决该问题,您可以使用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);
}
});
}