更新UI而不冻结

时间:2013-05-27 00:53:32

标签: android multithreading handler runnable grid-layout

我有一个GridLayout,里面有几个按钮。

我需要每隔3秒更改一个序列中每个按钮的颜色。

我在这里遇到问题......看看我的代码:

runnableScan = new Runnable() {
    @Override
    public void run() {
        GridLayout view = Grid;
        for ( int i = 0; i < view.getChildCount(); i++) {
            Button btn = (Button)view.getChildAt(i);
            btn.setBackgroundColor(Color.RED);
            handlerScan.postDelayed(this, 3000);                                        
        }
    }
};      
handlerScan.postDelayed(runnableScan, 3000);      

嗯..它确实将所有按钮的颜色更改为红色,但它会立即更改所有按钮 !!!

我希望它能够改变序列中的颜色,每3秒钟一个按钮。

如果我在其中放置ToastToast将每三秒钟使用每个按钮的索引触发。

我做错了什么?为什么所有按钮都会立刻变为红色?

1 个答案:

答案 0 :(得分:0)

可运行的run()方法仍在所有按钮上循环,并在一次调用{{}期间更改所有的颜色1}}。

这一行:

run()

不会在 handlerScan.postDelayed(this, 3000); 循环的迭代之间添加延迟。它只计划在3秒后再次调用for。试试这个(使用 no for loop )。

run()

您需要在班级中跟踪 runnableScan = new Runnable() { @Override public void run() { GridLayout view = Grid; Button btn = (Button)view.getChildAt(buttonIndex++); if (btn != null) { btn.setBackgroundColor(Color.RED); handlerScan.postDelayed(this, 3000); } } }; handlerScan.postDelayed(runnableScan, 3000); 作为成员变量:

buttonIndex

然后将其初始化为第一个按钮的索引。例如,如果您在private int buttonIndex; 中设置内容视图,请使用:

onCreate()

我向您展示的代码的工作方式是将按钮1的颜色更改为红色,然后3秒后将按钮2更改为红色,然后3秒后将按钮3更改为红色。如果您想再次启动该过程,只需在完成更改按钮3后,将 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.some_layout_name); GridLayout view = Grid; for (buttonIndex = 0; buttonIndex < view.getChildCount(); buttonIndex++) { View v = view.getChildAt(buttonIndex); if (v instanceof Button) { // we found the first button, so stop looping break; } } handlerScan = new Handler(); 重置回第一个按钮的索引。