前幾篇文章寫的都是網絡請求數據,在請求到數據之後,要現在在UI界面上時,總是使用Handler攜帶請求下來的數據發送一條消息,在Handler的handlerMessage()方法中修改UI,這篇文章將講述它的原理(我自己理解的,不喜勿噴)。
Android規定:
1、不能在主線程中做耗時操作,如果在主線程中做耗時操作,則會出現ANR(Application Not Response)錯誤。
2、不能在子線程中修改UI界面。
要遵守以上兩個規定,在請求到網絡數據後,通常情況下,我會使用Handler消息更新UI。
在程序運行起來的時候,應用的主線程會啓動Looper對象的消息隊列,主線程會一直從消息隊列中循環的取消息,在主線程中,創建一個Handler對象,使用該對象可以在應用的任何地方向主線程發送消息,如果取到消息了,則在主線程的Handler對象的handlerMessage()方法中處理消息。
Handler消息機制的步驟
1、創建Handler對象,並重寫handlerMessage()方法。
private Handler mHandler = new Handler (){
@Override
public void handleMessage (Message msg) {
switch (msg.what){
case MSG_STRING:
String text = (String) msg.obj;
tv.setText (text);
break;
case MSG_IMAGE:
Bitmap bitmap = (Bitmap) msg.obj;
iv.setImageBitmap (bitmap);
break;
}
}
};
2、在其它線程中發送消息。
//發送Handler消息,跟新UI
Message msg = new Message ();
msg.what = MSG_IMAGE;
msg.obj = bitmap;
mHandler.sendMessage (msg);
3、根據消息即攜帶的參數,修改UI。
Bitmap bitmap = (Bitmap) msg.obj;
iv.setImageBitmap (bitmap);
注意:1、創建消息對象時,儘量使用
Message msg = Message.obtain ();
2、使用msg.what區別不同的消息。
3、參數一般放在msg.obj中。