android應用是單線程模式的。
單線程模式需要記住兩條:
一、防止UI線程阻塞
二、確保只在UI線程中訪問Android UI工具包
在開發Android應用時必須遵守單線程模型的原則:Android UI操作並不是線程安全的並且這些操作必須在UI線程中執行。
在此介紹下何謂UI線程:當一個程序第一次啓動時,Android會同時啓動一個對應的主線程(Main Thread),主線程主要負
責處理與UI相關的事件,如:用戶的按鍵事件,用戶接觸屏幕的事件以及屏幕繪圖事件,並把相關的事件分發到對應的組件
進行處理。所以主線程通常又被叫做UI線程。
什麼情況下會出現線程阻塞?如在登錄時,一般會去訪問網絡,這個需要一段時間,如果寫帶UI線程中,則會出現界面假死
現象,也就是界面卡住不支持用戶交互,這一點在要求高交互的手機上肯定是不能容許的。ok,這個時候你可能會去考慮新
開一個線程或者在後臺線程中來執行耗時的操作,如下面的例子:
public void onClick( View v ) {
new Thread( new Runnable() {
public void run() {
Bitmap b = loadImageFromNetwork(); //從網絡上下載圖片
mImageView.setImageBitmap( b ); //把圖片設置給ImageView
}
}).start()
}
上面的代碼會報錯,你可能會說邏輯很正確啊,但是它違背了Android單線程模型:Android UI操作並不是線程安全的並且
這些操作必須在UI線程中執行。
Andriod提供了幾種在其他線程中訪問UI線程的方法:
Activity.runOnUiThread( Runnable )
View.post( Runnable )
View.postDelayed( Runnable, long )
Hanlder
下面引人android的異步處理機制:Handler和AsyncTask。其中AsyncTask比hander更輕量級一些。在Android1.5中
提供了AsyncTask。它使創建需要與用戶界面交互的長時間運行的任務變得更簡單。
•線程無法管理,匿名線程創建並啓動後就不受程序的控制了,如果有很多個請求發送,那麼就會啓動非常多的線程,系統
•另外,前面已經看到,在新線程中更新UI還必須要引入handler,這讓代碼看上去非常臃腫。
•Params 啓動任務執行的輸入參數,比如HTTP請求的URL。
•Progress 後臺任務執行的百分比。
•Result 後臺執行任務最終返回的結果,比如String。