2016-04-27 61 views
0

在Android中,如果我想在非UI線程(如的setText爲TextView的)來修改一些視圖的屬性,我必須寫代碼這樣的:爲什麼non-ui線程無法修改視圖屬性?

runOnUiThread(new Runnable(){ 
    textView.setText("Hello world"); 
}); 

而在C#中,我必須使用委託,這更復雜。

那麼爲什麼他們(框架)不幫我們在內部代碼中做這些事情?

void setText(string text){ 
    if(isInMainThread()){ 
     //direct set text 
    }else{ 
     post(new Runnable(){ 
     setText(text); 
     }); 
    } 
} 

是否有任何理由類同Java線程停止方法不推薦使用,因爲流量必須通過編碼器來控制嗎?

在此先感謝,並原諒我可憐的英語。

+0

所有與UI繪圖相關的工作都在1個線程中完成,因此改變UI的代碼應該被推送到這個線程,否則會出現併發問題 – Bhargav

+0

我同意。但是,爲什麼框架不能幫助我們做這些exra的事情,他們可以檢測,如果不在主線程然後記錄它,並在主線程後做這些事情。 –

回答

1

簡短回答:由於Android的單線程架構,UI工具包不是線程安全的。

在這裏你可以找到Android的官方文檔的完整的答案Android - Processes and Threads

當應用程序組件啓動,應用程序沒有運行任何其他成分,Android系統開始一個新的Linux程序與應用程序一個執行線程。默認情況下,同一應用程序的所有組件都運行在相同的進程和線程中(稱爲「主」線程)。

此外:

的Andoid UI工具包不是線程安全的。所以,你不能從工作者線程操縱你的UI - 你必須從UI線程對你的用戶界面進行所有操作。因此,有簡單的兩個規則Android的單線程模型:

  1. 不要阻塞UI線程
  2. 不要從UI線程
+1

線程創建者明白爲什麼android是單線程的,他想知道的是爲什麼像'TextView.setText'這樣的方法負責檢查是否在UI線程上執行特定的方法,如果不是在UI線程中運行代碼代替。像他在他的問題 – Bhargav

+0

中發佈的代碼片段,他可以出於上述原因,UI不是線程安全的。 –

1

是外部訪問Android的UI工具包,我同意,創作者可以這樣做,但可能它來自Android架構的SOLID設計。

SOLID是一個首字母縮寫,代表了面向對象編程和設計的5個基本原理。在我看來,如果view'd檢查了調用哪個方法的線程,它將違反單個責任原則 - view應負責檢查使用哪個線程?恕我直言,它不應該。我認爲Android的創作者會同意我的觀點)

據我所知在當前體系結構中,當您通過setText方法更改文本時,視圖會發送通知其狀態已更改並且操作系統負責重新繪製它,但是說實話,我仍然不知道它是如何處理的細節。

此外,採用這種方法,Android創作者試圖鼓勵應用程序開發人員考慮在哪個線程上調用哪些操作 - 例如,大型計算任務不應該是UI動畫的一部分。

+0

感謝您的回答。 –

+0

@DaSqyStc不客氣 –

相關問題