ハンドラーのメッセージ受け渡しメカニズムの簡単な分析
このセクションの概要
最初の 2 つのセクションでは、Android の 2 つのイベント処理メカニズムについて説明しました。このセクションでは、次の 2 種類のイベント応答のみを説明します。 これは、アクティビティの UI コンポーネントの情報転送ハンドラーです。多くの友人は、スレッドの安全性のため、インターフェイスを更新するときに UI スレッドの外で UI を何度も操作できないことを知っていると思います。ハンドラーを通じて UI コンポーネントの更新を通知する必要があります。 Handler を使用してインターフェイスの更新を完了するだけでなく、runOnUiThread() を使用して更新したり、さらに高度なトランザクション バスを使用したりすることもできます。もちろん、ここでは、Handler、Handler とは何か、実行プロセス、関連メソッド、サブでの使用についてのみ説明します。 -スレッドとメインスレッドの違いなど。
学習ロードマップ:
2.ハンドラークラスの紹介:
3.ハンドラー実行フローチャート:
フローチャート分析: 関連名詞
- UI スレッド: システムが UI スレッドを作成すると、Looper オブジェクトが初期化され、それに関連付けられた MessageQueue も作成されます。
- Handler: その機能は、情報を送信して処理することです。ハンドラーを正常に動作させたい場合は、現在のスレッドに Looper オブジェクトが存在する必要があります
- Message: ハンドラーが受信して処理するメッセージ オブジェクト
- MessageQueue: メッセージ キュー、先入れ先出し管理メッセージ。Looper オブジェクトが初期化されるときに初期化されます。 それに関連付けられた MessageQueue を作成します。
- Looper: 各スレッドは Looper を 1 つだけ持つことができ、MessageQueue を管理し、そこから継続的にメッセージを取り出して、対応する処理用ハンドラ!
簡単に言うと、
サブスレッドがアクティビティ内の UI コンポーネントを変更したい場合、新しい Handler オブジェクトを作成し、このオブジェクトとその情報を通じてメインスレッドに情報を送信できます。送信するメッセージは、まずメインスレッドの MessageQueue に移動して待機し、Looper が先入れ先出しの順序でそれを取り出し、メッセージの属性に応じて処理のために対応するハンドラーに配布します。物体!
4. ハンドラーの関連メソッド:
5. ハンドラーの使用例:
- void handleMessage(Message msg): メッセージを処理するためのメソッド。通常はオーバーライドされます。
- sendEmptyMessage(int what): 空のメッセージを送信します。
sendEmptyMessageDelayed- (int what, long lateMillis): 遅延をミリ秒単位で指定した後、空のメッセージを送信します
sendMessage- (Message msg): メッセージをすぐに送信します
sendMessageDelayed- (Message msg): 遅延をミリ秒単位で指定しますメッセージの送信 final boolean
hasMessage- (int what): 指定された値としてどの属性を持つメッセージがメッセージ キューに含まれているかどうかを確認します パラメータが (int what, Object object) の場合: what 属性を判断することに加えて、Object 属性が指定されたオブジェクトのメッセージであるかどうかも判断する必要があります
1 ) ハンドラーはメインスレッドで記述されます
メインスレッドでは、システムが既に Looper オブジェクトを初期化しているため、情報を送信して処理するための Handler オブジェクトを直接作成します。コード例:
Timerタイマーを使用して画像を定期的に切り替える簡単なプログラムで、ImageViewによって表示されるコンテンツを定期的に変更し、それによってフレームアニメーションを形成します
レンダリングの実行:実装コード:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
tools:context="com.jay.example.handlerdemo1.MainActivity " >
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" " />
</RelativeLayout>
MainActivity.java:
//切り替えられた画像の配列IDを定義
int imgids[] = new int[]{
R.drawable.s_1, R.drawable.s_2,R.drawable.s_3,
R.drawable.s_4,R.drawable.s_5,R.drawable.s_6,
@Override - - - { [imgstart++ % 8]); [ edInstanceState);
setContentView(R. layout.activity_main);
final ImageView imgchange = (ImageView) FindViewByid (R.id.imgchange);
// タイマーを使用し、ハンドラーに 200 ミリ秒ごとに空の情報を送信させます
new timer ().
myHandler.sendEmptyMessage(0x123);
ハンドラーがサブスレッドで記述されている場合、作成プロセスは次のとおりです。
1 )
Handler オブジェクトを作成し、処理する handleMessage() メソッドをオーバーライドします。他のスレッドからの情報!
3)
Looper.loop() メソッドを呼び出して Looper を開始します使用例: 数値を入力すると、計算後、この範囲内のすべての素数が Toastandroid:layout_width="match_parent"実装コードを通じて出力されます: main.xml:<LinearLayout
xmlns:android="http://schemas.android. com/apk /res/android"
android:layout_height="match_parent"
android:orientation="vertical"><EditText android:id="@+id/etNum" android: inputType="number"
android:layout_width="match_parent"<ボタン
android:layout_width="match_parent; "
android:layout_height ="wrap_content"
android:onClick="cal"
android:text="Calculate"/>
</LinearLayout>
MainActivity.java:
{
staticfinal String UPPER_NUM = "upper";
EditText etNum;
// スレッドクラスを定義する
class CalThread extends Thread
{
public Handler mHandler;実行()
run メッセージメソッド
@Override use using using メッセージ using ‐ through through through through through through through through through out through out over の ‐ over の ‐ over ‐ over ‐ ‐ n r and and ‐ to to 0x123 を使用するメッセージ); integer&gt; nums&lt; gt;();for(int i = 2; i&lt; = upper; i ++); i); if(i!= 2 && i%j == 0)
);//トーストを使用して、カウントされたすべての素数を表示する
のs-を表示します。 {savedinstance.main); = 新しい Message();
msg.what = 0x123; バンドル バンドル = new Bundle();
Int eger.parseInt(etNum.getText().toString());バンドル);//新しいスレッドのハンドラーにメッセージを送信します
. Handler、Message、MessageQueue を区別する必要があります。 Loopの概念とメインスレッドとサブスレッドで書くHandlerの違い!