Android之Handler在新線程中處理消息

fmms 12年前發布 | 36K 次閱讀 Android Android開發 移動開發

在上一篇博客中介紹了利用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");
        }
    }

}
運行并查看日志輸出結果: Android之Handler在新線程中處理消息

轉自:http://blog.csdn.net/jjaze3344/article/details/7249524

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