2011-08-17 30 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的一部分 –