Android之Handler在新線程中處理消息
在上一篇博客中介紹了利用post方法將線程添加到handler消息隊列其實是和主線程在同一線程中運行的,如果這一線程是一個耗時操作的話主線 程會等這個線程的run方法運行之后才會繼續進行下面的操作,而此時主線程可以理解為處于假死狀態,用戶可能會理解為掛掉了,這樣的情況肯定是萬萬不能出 現的,那么怎么解決這一問題呢。
第一種方法就是不調用handler的post方法,而是像我們原來在java中實現多線程方法一樣,創建一個Thread,然后調用start方法。
第二種方法就是利用android開發框架中的looper類來實現:
首先創建一個HandlerThread新線程并調用start方法HandlerThread handlerThread = new HandlerThread("handler_thread");
handlerThread.start();將handlerThread的looper作為參數綁定到一個繼承handler的子類線程中: MyHandler myHandler = new MyHandler(handlerThread.getLooper());
class MyHandler extends Handler{
public MyHandler(){
}
public MyHandler(Looper looper){
super(looper);
}
public void handleMessage(Message msg){
}
}在handlerMessage方法中處理消息。 在實例中:
package cn.android.handler;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
public class HandlerTestActivity extends Activity {
/** Called when the activity is first created. */
private static final String SWORD="SWORD";
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//打印當前線程ID
Log.i(SWORD,"Activity--->"+Thread.currentThread().getId());
//生成一個HandlerThread對象,實現了使用Looper來處理消息隊列
HandlerThread handlerThread = new HandlerThread("handler_thread");
//在使用HandlerThread的getLooper()方法之前,必須先調用該類的start()方法啟動線程
handlerThread.start();
MyHandler myHandler = new MyHandler(handlerThread.getLooper());
Message msg = myHandler.obtainMessage();
//將msg發送到目標對象,所謂的目標對象,就是生成該msg對象的handler對象
Bundle b = new Bundle();
b.putInt("age", 20);
b.putString("name", "Jhon");
msg.setData(b);
//發送消息對象
msg.sendToTarget();
}
class MyHandler extends Handler{
public MyHandler(){
}
public MyHandler(Looper looper){
super(looper);
}
public void handleMessage(Message msg){
Bundle b = msg.getData();
int age = b.getInt("age");
String name = b.getString("name");
Log.i(SWORD,"age--"+age+" name---"+name);
Log.i(SWORD,"handlerId"+Thread.currentThread().getId());
Log.i(SWORD,"handlerMessage");
}
}
}運行并查看日志輸出結果: 
轉自:http://blog.csdn.net/jjaze3344/article/details/7249524
本文由用戶 fmms 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!