我正在尝试根据特定条件(例如string =“a”或“b”)在指定的时间内(在每次颜色切换之间暂停)设置ImageView的背景颜色。我的问题是我似乎无法使整个应用程序等待一个更改,直到它继续下一个,所以对于用户它看起来像颜色开始然后立即是最后一个颜色。
我已经尝试过CountDownTimers(只是在其他计时器运行时继续执行),处理程序(postDelayed(null,5000)),Thread.Sleeps等。
以下是我正在尝试做的一个例子:
将ImageView上的颜色设置为红色
睡500码
for(int i = 0; i < stringArray.length; i++){
if(stringCompare = "a") {
Set color on ImageView to blue
sleep for 500ms }
else if(stringCompare = "b") {
Set color on ImageView to blue
sleep for 1000ms
}
Set color on ImageView to red
sleep for 500ms
}
我知道这有点疯狂,但我已经尝试了所有上述方法,我认为没有成功实际让程序等待,但没有完全停止它。
感谢。
答案 0 :(得分:3)
在过去二十年中,大多数GUI都基于事件驱动模型。某些(如Android)使用单线程事件驱动模型。您更改颜色的请求不会立即生效;相反,它将消息放在工作队列上,由主应用程序线程处理。该主应用程序线程也是运行代码的,除非您专门将该代码移动到后台线程。
因此,永远不要在主应用程序线程上休眠。否则,该线程被绑定并且无法处理任何类型的GUI事件,更不用说更改颜色的请求了。
postDelayed()
(在View
或Handler
上)将允许您在延迟之后安排在主应用程序线程上运行的代码,而不会占用主应用程序在那段延迟期间的线程。
答案 1 :(得分:2)
创建一个单独的线程来执行暂停和运行。从该线程发布消息到UI线程以更改其imageview的颜色。
答案 2 :(得分:2)
把它放在你的活动中(把它变成一个内部类):
private class ColorChanger extends Thread
{
final ImageView imageView;
public ColorChanger(ImageView imageView)
{
this.imageView = imageView;
}
private void changeColor(final int color)
{
YourActivity.this.runOnUiThread(new Runnable() {
public void run() {
// Set imageView to color here
}
});
}
@Override
public void run() {
try {
Thread.sleep(500);
changeColor(0xffff0000);
Thread.sleep(500);
changeColor(0xff0000ff);
// Etc.
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
然后你可以这样做:
new ColorChanger(/*Your imageview*/).start();
您活动中的任何地方。