2011-08-17 60 views
1

我在我的布局中有数百个CheckBox小部件,现在我正在尝试对它们进行反转,所以如果检查它不会被检查,反之亦然。显然,这样繁重的工作应该在单独的线程中完成,但问题在于所有的工作实际上都发生在UI上。线程代码的一部分:Android从第二个线程访问用户界面

for (int x = 0; x < list.getChildCount(); ++x) 
{ 
    final WListRowTarget curRow = (WListRowTarget)list.getChildAt(x); 
    curRow.post(new Runnable() 
    { 
    public void run() 
    { 
     try 
     { 
     curRow.getCheckBox().setChecked(!curRow.getCheckBox().isChecked()); 
     } 
     catch (Exception e) {} 
    } 
    }); 
} 

,这个线程实际上能做的就是通过列表循环和张贴了Runnable每一个复选框发现的唯一的事情。问题是,所有这些Runnables几乎同时到达UI线程,因此它们都会立即执行......应用程序的行为与我在UI线程中运行上述代码完全相同 - 一切都冻结。一个可能的解决方案是在每个复选框后休眠几毫秒,以便Runnable可以执行,并且UI将有时间处理事件......但它更像是一种黑客攻击。

我该如何解决这个问题?

由于提前, Snowak

+0

您是否使用了列表视图中显示的复选框? –

回答

0

好的,我自己解决了这个问题。解决方案是使用Object.wait()和Object.notify()来等待Object.post()来完成这项工作。这样,我不会发布更多的事件,直到执行前一个事件。

代码如下:

synchronized (someObject) 
{ 
    someObject.post(new Runnable() 
    { 
    // some work here 
    synchronized (someObject){ someObject.notify(); } 
    }); 
    someObject.wait(); // this line unlock the object 
} 
3

我有数百个复选框部件在我的布局,现在我试图反转他们每个人,所以如果有人检查它不会被检查,副反之亦然。显然,这种繁重的工作应该在单独的线程来完成

否 - 这根本就是UI的工作,并坦言设置一串标志是不是真的“重”的工作。涉及的大部分“工作”实际上是UI重新绘制 - 显然的确必须在UI线程上完成。创建大量不同的任务以在UI线程上执行,只需要给它更多工作要做 - 只需在线程上的一个批处理中完成整个批处理,而不尝试使用不同的线程。

作为一个单独的问题,我甚至不想在桌面上使用带有几百个复选框的UI,更不用说在移动设备上 - 您确定不应该重新设计您的UI吗?您可能会发现,提出一个更优雅的设计可以消除任何性能冲击...

+0

这只是我自定义的列表实现。 Android的ListView缺乏太多的功能(如将其放入ScrollView的可能性)。不管怎么说,还是要谢谢你。 –

0

假设您使用的是列表视图来显示您的所有复选框您不需要使用多个线程。将复选框的状态存储在数据结构中,并使用单个线程处理所有内容。

在做处理时(听起来很错:-))只显示一个微调。然后,您可以根据存储在数据结构中的状态显示所有复选框。

+0

我没有使用ListView,但无论如何感谢。 –

+0

那么你如何显示所有的复选框? –

+0

它们只是LinearLayout的一部分 –