1. 程式人生 > >關於Android的UI非執行緒安全

關於Android的UI非執行緒安全

1、我們都知道,在Android的開發中,非UI執行緒不能操作UI執行緒中的控制元件,即UI是非執行緒安全的;

2、但是在工作執行緒(非UI執行緒)中呼叫ProgressBar控制元件的setProgress(int count)方法時,程式執行並

    不會出現異常,

3、但是如呼叫setBackGround(int color)或者setVisibility(int v)時,程式執行後出現異常

4、第一和第三點說的通,但是第二點不能理解

問題:誰能給“在工作執行緒中操作主執行緒UI”下個定義,比如上面的setProgress是操作UI嗎?一般性判定原則是什麼?

其實這是一個典型的多執行緒的安全問題,當然在Android中也不能列外。在大多數應用程式中,我們通常會有一個UI執行緒,即Android的UI Looper執行緒,還有一個通訊執行緒,負責和伺服器端的互動。


那麼為什麼在非UI執行緒中可以呼叫ProgressBar呢?因為ProgressBar控制元件屬於非UI執行緒的變數,它為非UI執行緒所有,不存在多執行緒共享資料的問題;而在非UI執行緒中呼叫setBackGround(int color)等方法,就涉及到呼叫UI執行緒的Context等變數的問題,這樣就存線上程安全的隱患。

其實電腦科學中很多基本的原理都是相通的,無非是變換一個實現的角度而已,遇到問題需要多思考一下!