1 AsyncTask(或者Thread)+Handler
啓動子線程,子線程執行完任務後,通過Handler給主線程中的Looper發送消息
2 Activity.runOnUiThread(Runnable r)
在Activity中啓動子線程,子線程執行完成任務後,調用runOnUiThread(Runnable r)。runOnUiThread(Runnable r)是Activity中的方法,方法裏會判斷當前線程是否是UI線程,如果是,run()方法在UI線程執行,如果不是,通過mHandler把Runnable發送到主線程的Looper中,Looper取出消息再分發給mHandler,mHandler收到消息後,回調run()方法。mHandler是Activity中一個final修飾的成員,所有的Activity對象共用這一個handler對象。
3 View.post(Runnable r)
view.post(Runnable r)是view中的方法,方法裏會判斷AttachInfo是否爲空,(AttachInfo類似於window對象)如果不爲空,說明當前線程是UI線程,會調用Activity中的mHander post一個runnable到主線程的looper中。如果是其他線程的話,runnable會發送到ViewRootImpl的內部類RunQueue中, RunQueue中有個Arraylist存儲所有的Runnable, 最終會遍歷Arraylist中的Runnable,還是通過Activity中的mHandler發送到主線程的looper中。
4 設置監聽器,子線程完成任務後,回調監聽器的方法
例如,子線程發送http請求獲取title,拿到title後,在activity的textView中顯示