安卓網絡程式設計1--ANR異常和Handler機制
一、ANR異常
1、ANR :Application not response 應用無響應,如下: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的操作。如下圖所示。Handler的作用是用來發送消息和處理消息,MessageQueue的作用主要是用來接收消息,Looper的作用是用來監視消息,取出消息。