Android Messageとその使用


一、スレッド間通信のメッセージ構造
1、Messageの紹介
framweorks\base\core\java\android\Os\Message.java
Messageはスレッド間の情報伝達の担体であり、メッセージの記述と任意のデータオブジェクトを含む。Messageには2つの追加のintフィールドと一つのobjectフィールドが含まれています。このようにほとんどの場合、使用者はメモリ割り当てを行う必要がなくなります。Messageの構築関数はpublicであるが、Message.obtain()またはHandler.obtainMessage()関数を使用してMessageオブジェクトを取得するのが望ましい。Messageの実現にはリサイクルの仕組みが含まれているので、効率的に提供できる。
2、メッセンジャーQueの紹介
framweorks\base\core\java\android\Os\Message Que.java
Message QueはMessageの列を格納するために使用され、その中のMessageはLooperによって配布され、Messageは直接Message Queに追加するのではなく、Looperに関連するHandlerによって追加される。
3、ループ
framweorks\base\core\java\android\Os\Looper.java
Looperはスレッドでメッセージループを実行します。スレッド自体はメッセージループがないので、スレッド内でperpare関数を呼び出してからloopを呼び出してメッセージを処理します。Androidでは、メインスレッドが起動すると自動的にループが作られます。
スレッドを作成するループ:
public static final void prepare()
このスレッドを実行するループ:
public static final void loop()
このスレッドのループを取得:
public static final Looper myLooper()
メインスレッドのLooperを取得:
public synchronized static final Looper getMainLooper()
4、ハードラー
framweorks\base\core\java\android\Os\Handler.java
Handlerは、スレッドに関連するMessageおよびRunnableオブジェクトを送信して処理するために使用される。各Handlerは、個々のスレッド及びスレッドメッセージキューに関連付けられている。Handlerを作成すると、Handlerはスレッド及びスレッドメッセージ・キューに紐付けされ、その後、HandlerはMessageとRunnableを対応するメッセージ・キューに送信し、メッセージ・キューから出るメッセージを処理することができる。
Handlerは、ユーザが呼び出しを必要とするほとんどのインターフェースを提供しています。
A、Handlerを作成する:
ローカルスレッドに関連したHandlerを作成します。
public Handler() 

public Handler(Callback callback)
指定スレッドに関連付けられたHandlerを作成します。
public Handler(Looper looper)

public Handler(Looper looper, Callback callback)
B、作成メッセージ
public final Message obtainMessage()

public final Message obtainMessage(int what)

public final Message obtainMessage(int what, Object obj)

public final Message obtainMessage(int what, int arg1, int arg2)

public final Message obtainMessage(int what, int arg1, int arg2, Object obj)
C、メッセージの削除
メッセージキューに未処理のメッセージを削除します。
public final void removeMessages(int what)

public final void removeMessages(int what, Object object)
D、メッセージ送信
public final boolean sendMessage(Message msg)

public final boolean sendMessageDelayed(Message msg, long delayMillis)

public final boolean post(Runnable r)

public final boolean postDelayed(Runnable r, long delayMillis)
E、処理メッセージ
Looperのloop関数でMessage Queの受信メッセージ列のメッセージを繰り返し取り出し、Handerのdispatch Message関数を呼び出してメッセージを処理します。どのように処理するかはユーザによって指定されます。Handlerの中のmCallbackはCallbackインターフェースの対象を実現しました。中のhandlee Messageは処理します。メッセージHandlerオブジェクトに対応するクラスの継承を処理して、handleMessage関数を実装して、メッセージを処理します。
public void dispatchMessage(Message msg) {

if (msg.callback != null) {

       handleCallback(msg);

    } else {
       if (mCallback != null) {
         if (mCallback.handleMessage(msg)) {
            return;
         }
       }

       handleMessage(msg);
}
}
二、Message仕組みの用途
Message機構には二つの用途がある。
タイミング実行:指定時間まで遅延してメッセージスケジュールを実行する
スレッド通信:他のスレッドにいくつかの操作を並べて実行します。
1、タイミング実行
このスレッドのHandlerによってメッセージを指定の時間に遅延させて実行すると、タイマーの役割に相当します。
public final boolean sendMessageDelayed(Message msg, long delayMillis)

public final boolean postDelayed(Runnable r, long delayMillis)
指定された時間が満了する前に、removeMessageによって実行をキャンセルすることもできます。
2、スレッド通信
AndroidのUIはシングルスレッドであり、AndroidはUIスレッドがUserに迅速な反応を与えることを期待しており、UIスレッドが舞台裏のことをする時間がかかりすぎると、5秒以上騒いだら、Androidはエラーメッセージを送る。したがって、UIを引きずらないように、時間がかかる作業は独立したスレッドに任せるべきです。しかし、舞台裏のスレッドがUIオブジェクトを実行すると、Androidはまたエラーメッセージを送るので、UIスレッドと舞台裏スレッドは通信する必要があります。UIスレッドは作業を舞台裏スレッドに配信し、舞台裏スレッドが実行された後、対応する状態をUIスレッドに戻し、UIスレッドがUIに対応する更新を行うようにする。