Messageについて
3096 ワード
Android UIスレッドモデル------------------------UI:User InterfaceUIスレッド:Androidでは、メインスレッドのタスクはレイアウトのロード、初期化コントロール、構成コントロールの各属性およびリスナー、レスポンスイベントであり、これらのタスクはUIコントロールに関連しているため、AndroidのメインスレッドはUIスレッドとも呼ばれる.メインスレッドの使用原則は、UI関連の業務のみを処理し、必要な初期化を完了し、他のタスクはできるだけサブスレッドで完了し、ANRを回避することです.メインスレッドのUIコントロールが正しく更新、表示されることを保証するために、AndroidではサブスレッドのUIコントロールの更新は許可されない(厳密には、UIを作成するスレッドのみがUIを更新することを許可する).Androidにおけるスレッド通信モデル-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Androidでは,スレッド間通信は「メッセージメカニズム」を用いて実現される.サブスレッドでは,Handlerのクラスを用いてメッセージを発行し,メインスレッドではHandlerを用いてUIを更新する.
Messageについて-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Messageの一般的なプロパティは、int what:メッセージのタイプIDを表し、開発者が任意に指定することができ、通常は静的定数を使用するべきであり、また、各メッセージのint値が異なるべきであるint arg 1:メッセージにカプセル化する必要があるintタイプデータを示す.この属性の値は、数値的意味を持つint arg 2:arg 1 Object obj:参照arg 1としてMessageオブジェクトを作成する:Messageクラスはパラメータのない公有的な構造方法を提供するが、new Message()のような構文でオブジェクトを作成することは推奨されず、Messageを使用する.Obtain()シリーズメソッドは、Messageクラスの内部でメッセージオブジェクトの作成、管理などのシステム機能が実現されているため、オブジェクトを取得します.Messageのobtain()シリーズメソッドを使用する場合、obtain()メソッドでHandlerオブジェクトが指定されている場合は、最後にMessageオブジェクトのsendToTarget()メソッドを使用してメッセージの送信を実行する必要があります.
Messageについて-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Messageの一般的なプロパティは、int what:メッセージのタイプIDを表し、開発者が任意に指定することができ、通常は静的定数を使用するべきであり、また、各メッセージのint値が異なるべきであるint arg 1:メッセージにカプセル化する必要があるintタイプデータを示す.この属性の値は、数値的意味を持つint arg 2:arg 1 Object obj:参照arg 1としてMessageオブジェクトを作成する:Messageクラスはパラメータのない公有的な構造方法を提供するが、new Message()のような構文でオブジェクトを作成することは推奨されず、Messageを使用する.Obtain()シリーズメソッドは、Messageクラスの内部でメッセージオブジェクトの作成、管理などのシステム機能が実現されているため、オブジェクトを取得します.Messageのobtain()シリーズメソッドを使用する場合、obtain()メソッドでHandlerオブジェクトが指定されている場合は、最後にMessageオブジェクトのsendToTarget()メソッドを使用してメッセージの送信を実行する必要があります.
pbProgress = (ProgressBar) findViewById(R.id.pb_progress);
handler = new InnerHandler();
}
private class UpdateProgressThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
// Message msg = Message.obtain(handler);
// msg.what = MESSAGE_UPDATE_PROGRESS;
// msg.arg1 = i + 1;
// msg.sendToTarget();
// 1: (handler)
// 2: (what)
// 3: (arg1)
// 4: (arg2, )
Message.obtain(handler, MESSAGE_UPDATE_PROGRESS, i+1, 0).sendToTarget();
// handler.sendMessage(msg);
// handler.sendEmptyMessage(MESSAGE_UPDATE_PROGRESS);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
private class InnerHandler extends Handler {
@Override
public void handleMessage(Message msg) {
if(MESSAGE_UPDATE_PROGRESS == msg.what) {
pbProgress.setProgress(msg.arg1);
}
}
}