如何暂停但不冻结Android执行?

时间:2011-03-11 15:59:22

标签: java android

我正在尝试根据特定条件(例如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  
}  

我知道这有点疯狂,但我已经尝试了所有上述方法,我认为没有成功实际让程序等待,但没有完全停止它。

感谢。

3 个答案:

答案 0 :(得分:3)

在过去二十年中,大多数GUI都基于事件驱动模型。某些(如Android)使用单线程事件驱动模型。您更改颜色的请求不会立即生效;相反,它将消息放在工作队列上,由主应用程序线程处理。该主应用程序线程也是运行代码的,除非您专门将该代码移动到后台线程。

因此,永远不要在主应用程序线程上休眠。否则,该线程被绑定并且无法处理任何类型的GUI事件,更不用说更改颜色的请求了。

postDelayed()(在ViewHandler上)将允许您在延迟之后安排在主应用程序线程上运行的代码,而不会占用主应用程序在那段延迟期间的线程。

答案 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(); 

您活动中的任何地方。