2012-11-27 50 views
0

如果視圖的可見性爲GONE,將會崩潰一個應用程序,該應用程序會更改文本,背景資源並在後臺線程中擴充其中的一些視圖?我用兩個按鈕做了一些測試,一個可見,一個不見了,如果我在後臺線程中改變了可見的文本,崩潰了,當我用GONE可見性更改按鈕的文本時,它沒有崩潰。有人可以解釋這個嗎?android從後臺線程更改UI - 爲什麼它的工作?

回答

1

好的,我有一個給你的東西。

事件處理和線程

視圖的基本循環如下:

  1. 事件進來,被分派到相應的視圖。 視圖處理事件並通知任何偵聽器。

  2. 如果在處理事件的過程中,視圖的邊界可能需要更改 ,視圖將調用requestLayout()

  3. 同樣,如果在處理事件的過程中視圖的 外觀可能需要更改,視圖將會調用invalidate()

  4. 如果任requestLayout()invalidate()被稱爲,框架 將採取測量,佈局,並繪製樹 適當的照顧。

注:整個視圖樹是單線程。在任何視圖中調用任何方法時,您都必須在UI線程上。如果你正在其他線程上工作,並想從該線程更新視圖的狀態,則應使用Handler。

你可以在這裏找到更多http://developer.android.com/reference/android/view/View.html

在你的情況你的視圖已經是GONE了,所以我認爲它沒有附加到視圖樹。

+0

讓我知道如果你需要更多的信息或我錯過了什麼。 – user370305

+0

這將解釋爲什麼用另一個線程的GONE可見性更改按鈕的文本不會崩潰......謝謝 –

1

您必須創建一個處理程序!
在該處理程序中,將代碼更新爲UI,並在線程中調用Handler!
您不應該直接從線程中更新UI的語言!這是編程中的一個大錯誤!

例子創建你的處理程序:

static Handler updater1 = new Handler() { 
@Override 
public void handleMessage(Message msg) { 
    //your code to update the UI 
    } 
}; 

實例從線程調用處理:

updater1.sendEmptyMessage(0); 

有關的文字從一個線程改變的行爲可以在所有語言研究不同!但你永遠不應該這樣做,這是一個很大的錯誤!
也許當您嘗試更新可見性爲「GONE」的按鈕上的文本時,它不起作用!但你看不到它!

+0

好的,但我需要知道爲什麼它的工作按鈕與GONE可見性? –