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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!