Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 使用handler實現線程間發送消息 (主線程 與 子線程之間)、(子線程 與 子線程之間)

Android 使用handler實現線程間發送消息 (主線程 與 子線程之間)、(子線程 與 子線程之間)

編輯:關於Android編程

關鍵字:Android 使用handler實現線程間發送消息 (主線程 與 子線程之間)、(子線程 與 子線程之間)

 

相信大家平時都有使用到異步線程往主線程(UI線程)發送消息的情況。本文主要研究Handler的消息發送。包括主線程往子線程發送消息,子線程之間互相發送消息。

 

一、主線程向子線程發送消息。

 

實現過程比較簡單:

 

主線程發送消息到異步線程,異步線程接收到消息後在再發送一條消息給主線程。

 

1. 初始化主線程的Handler,用來接收子線程的消息。

2. 啟動異步線程,在異步線程中創建Looper,並初始化一個異步線程的Handler。

3. 主線程獲取異步線程的Handler(這裡涉及到線程間同步的知識),並向異步線程發送消息。

4. 異步線程Handler接收到消息以後,獲取主線程的Handler,並向主線程發送消息。

5. 主線程收到異步線程發來的消息。

 

注:

1. 這裡說的主線程Handler或者異步線程Handler,指的是綁定在對應線程消息隊列上的一個Handler對象而已,在Handler的構造函數中傳入對應線程的Looper對象即可。

2. 為什麼要使用線程鎖來處理,是因為異步線程啟動不是實時的,主線程獲取異步線程的Handler時有可能為空,如果為空,需要等待異步線程先初始化Handler。

 

上代碼:

 

package com.example.chen.myapplication;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;

/**
 * 用Handler測試主線程往子線程發送消息
 * @author chen
 */
public class HandlerSimpleActivity extends Activity {

    private Handler mainHandler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 啟動異步線程
        final AsyncThread asyncThread = new AsyncThread();
        asyncThread.start();

        // 初始化主線程的Handler
        mainHandler = new Handler(Looper.myLooper(), new Handler.Callback() {
            @Override
            public boolean handleMessage(Message msg) {
                // 主線程收到消息
                Log.e(HandlerSimpleActivity.class.getSimpleName(),
                        MainHandler Receiver Message curThread = 
                                + Thread.currentThread().getName());
                return false;
            }
        });


        // 獲取異步線程的Handler
        Handler handler = asyncThread.getHandler();
        if (handler != null) {
            Log.e(HandlerSimpleActivity.class.getSimpleName(),
                    MainThread Send Message curThread = 
                            + Thread.currentThread().getName());
            // 向異步線程發送消息
            handler.sendEmptyMessage(0);
        }

    }

    /**
     * 異步線程
     */
    private class AsyncThread extends Thread {

        private Handler handler;

        @Override
        public void run() {
            super.run();
            Log.e(HandlerSimpleActivity.class.getSimpleName(),
                    AsyncThread Start curThread = 
                            + Thread.currentThread().getName());

            Looper.prepare();  // 初始化異步線程的消息循環隊列

            if (handler == null) {
                synchronized (AsyncThread.class) { // 線程間安全
                    // 為異步線程的消息循環隊列新增一個Handler
                    handler = new Handler(Looper.myLooper(), new Handler.Callback() {
                        @Override
                        public boolean handleMessage(Message msg) {
                            // 異步線程收到消息
                            Log.e(HandlerSimpleActivity.class.getSimpleName(),
                                    AsyncHandler Receiver Message curThread = 
                                            + Thread.currentThread().getName());

                            // 異步線程發送消息到主線程
                            Log.e(HandlerSimpleActivity.class.getSimpleName(),
                                    AsyncThread Send Message curThread = 
                                            + Thread.currentThread().getName());
                            mainHandler.sendEmptyMessage(0);
                            return false;
                        }
                    });

                    // 異步線程Handler初始化完畢
                    Log.e(HandlerSimpleActivity.class.getSimpleName(),
                            AsyncHandler Inited curThread = 
                                    + Thread.currentThread().getName());

                    // 釋放鎖
                    AsyncThread.class.notifyAll();
                }
            }

            Looper.loop();
        }

        /**
         * 獲取異步線程的Handler
         * @return
         */
        public Handler getHandler() {
            if (handler == null) {
                synchronized (AsyncThread.class) {  // 線程間安全
                    if (handler == null) {
                        try {
                            // 獲取異步線程的handler為空,釋放鎖,等待異步線程初始化完畢。
                            Log.e(HandlerSimpleActivity.class.getSimpleName(),
                                    getHandler wait curThread = 
                                            + Thread.currentThread().getName());
                            AsyncThread.class.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                        // 異步線程Handler初始化完畢,主線程繼續
                        Log.e(HandlerSimpleActivity.class.getSimpleName(),
                                getHandler notified curThread = 
                                        + Thread.currentThread().getName());
                        return handler;
                    } else {
                        return handler;
                    }
                }
            } else {
                return handler;
            }
        }
    }
}

 

 

上結果截圖:

\

 

二、子線程間使用Handler互相發送消息:

 

2015年7月26日19:47:31 等待下次更新(*^__^*) 嘻嘻……

 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved