一部分搜索於u0116826736的博友;僅供參考!
============================================================================
當app訪問數據遇到阻塞時候,用戶體驗不是很好,這時需要優化,就需要開啟一個線程來作為異步去請求,為了美觀體驗可在頁面設置一個圈圈表明等待;等到線程處理接受網絡的數據回來后,在是有ui線程更新ui;
注:一般在一些需要耗時的操作上會開啟線程;來進行優化;
對於線程的理解:
在一個Android 程序開始運行的時候,會單獨啟動一個Process。默認的情況下,所有這個程序中的Activity或者Service(Service和 Activity只是Android提供的Components中的兩種,除此之外還有Content Provider和Broadcast Receiver)都會跑在這個Process。 一個Android 程序默認情況下也只有一個Process,但一個Process下卻可以有許多個Thread。在這么多Thread當中,有一個Thread,我們稱之為UI Thread。UI Thread在Android程序運行的時候就被創建,是一個Process當中的主線程Main Thread,主要是負責控制UI界面的顯示、更新和控件交互。在Android程序創建之初,一個Process呈現的是單線程模型,所有的任務都在一個線程中運行。因此,我們認為,UI Thread所執行的每一個函數,所花費的時間都應該是越短越好。而其他比較費時的工作(訪問網絡,下載數據,查詢數據庫等),都應該交由子線程去執行,以免阻塞主線程。 那么,UI Thread如何和其他Thread一起工作呢?常用方法是: 誕生一個主線程的Handler物件,當做Listener去讓子線程能將訊息Push到主線程的Message Quene里,以便觸發主線程的handlerMessage()函數,讓主線程知道子線程的狀態,並在主線程更新UI。
更新ui的幾種方式:
方法一:用Handler
1、主線程中定義Handler:
2、子線程發消息,通知Handler完成UI更新:
方法一的Handler對象必須定義在主線程中,如果是多個類直接互相調用,就不是很方便,需要傳遞content對象或通過接口調用;
方法二:用Activity對象的runOnUiThread方法更新
在子線程中通過runOnUiThread()方法更新UI:
如果在非上下文類中(Activity),可以通過傳遞上下文實現調用;
這種方法使用比較靈活,但如果Thread定義在其他地方,需要傳遞Activity對象;
方法三:View.post(Runnable r)
這種方法更簡單,但需要傳遞要更新的View過去;
方法四:AsyncTask
總結:UI的更新必須在主線程中完成,所以不管上述那種方法,都是將更新UI的消息發送到了主線程的消息對象,讓主線程做處理;