天天看點

安卓網絡程式設計1--ANR異常和Handler機制

安卓網絡程式設計1--ANR異常和Handler機制

一、ANR異常

1、ANR :Application not response 應用無響應,如下:
安卓網絡程式設計1--ANR異常和Handler機制
ANR的原因:在主線程中做了耗時的操作,比如通路網絡、拷貝大資料等
ANR解決辦法:将所有的耗時操作(聯網、拷貝大資料、下載下傳等耗時的操作)都放到子線程中,避免在UI線程中執行耗時操作。
注意:
[1]、隻要不是在new thread(){run();}.start();【或者Runnable接口的run方法】内執行的線程都是在主線程中執行的
[2]、java中建立線程有2中方式:1繼承Thread類,2實作Runnable接口
[3]、隻有主線程才可以更新ui,子線程隻能向主線程發送消息,然後在主線程中更新UI。這是谷歌的規定,是為了避免線程的同步與互斥問題。
2、在子線程中用handler向主線程發消息,然後在主線程中更新UI。
3、消息機制的寫法 
3.1、在主線程建立一個handler對象
private Handler handler = new Handler();
3.2、重寫handler的handlemessage方法,注意Handler類中handleMessage()方法是一個空方法,需要重寫。
public void handleMessage(android.os.Message msg) {更新UI}
3.3、在子線程中用在主線程建立的handler對象(助手)發消息 
Message msg = new Message();
handler.sendMessage(msg); 
//該消息會儲存到主線程中的消息隊列中【Messagequeue】,由循環器【Looper】不停的監視消息隊列,取出消息隊列中的消息交給【Handler】的handleMessage方法處理。
3.4、handleMessage方法收到消息後就會執行,在這個方法裡面更新ui。
注意:
1、隻要有更新UI的操作都必須用handler機制,

2、子線程一般處理耗時等操作,而不能處理更新UI的操作,

3、主線程一般處理更新UI的操作,而不能處理耗時的操作。

二、Handler消息機制
同類參考文章:http://blog.csdn.net/lmj623565791/article/details/38377229
一個安卓應用啟動時,會在主線程中會同時啟動一個MessageQueue消息隊列和一個Looper循環器,來接收消息和檢測消息,當子線程向主線程發送消息時sendMessage,該消息會被加入到主線程的消息隊列中,當Looper循環器周遊到該消息時,就會把該消息傳遞給Handle,Handle就用調用自己的handler.message()方法來處理消息,執行更新UI的操作。如下圖所示。
安卓網絡程式設計1--ANR異常和Handler機制
Handler的作用是用來發送消息和處理消息,
MessageQueue的作用主要是用來接收消息,
Looper的作用是用來監視消息,取出消息。