記事ディレクトリ
I.はじめに
- 説明: 静的 UI インターフェイス複数のリソースを同時にロードし、動的フィードバックを視覚的に取得する必要がある場合は、ハンドル メッセージ メカニズムを使用する必要があります。
- ナレッジポイント: ハンドルメッセージメカニズム
- 難易度: 初級
- 理解する
2. 理解
1. ハンドルを使用する理由
公式ルールによると、サブスレッドはメインスレッド内のコンポーネントを操作することはできません。
2. 概略図
3. 主要なオブジェクト
(1) メッセージ(メッセージクラス)
メッセージはスレッド間で渡されるメッセージであり、少量の情報を内部的に運ぶことができ、異なるスレッド間でデータを交換するために使用されます。
属性 | タイプ | 説明する |
---|---|---|
引数1 | 整数 | 整数データの保存に使用されます |
引数2 | 整数 | 整数データの保存に使用されます |
オブジェクト | 物体 | 受信者に送信されるオブジェクト型のオブジェクトを保存するために使用されます。 |
返事 | メッセンジャー | このメッセージの送信先を指定するために使用されるオプションの Messager オブジェクト。 |
何 | 整数 | 受信者が理解できるように、ユーザー定義のメッセージ コードを指定するために使用されます。 |
(2) ハンドラ(メッセージ機構)
ハンドラーは主にメッセージの送信とメッセージの処理に使用されます。メッセージの送信には通常、Handelr オブジェクトの sendMessage() メソッドが使用され、一連の処理を経て、最終的には Handler の handlerMessage() メソッドにメッセージが渡されます。
(3) MessageQueue(メッセージ処理クラス)
MessageQueue はメッセージキューを意味し、主に
Handler を通じて送信されたメッセージを格納するために使用されます。Handler を介して送信されたメッセージは、MessageQueue に格納され、処理を待機します。
方法 | 説明する |
---|---|
handleMessage(メッセージメッセージ) | メッセージを処理するメソッド。このメソッドは通常、メッセージを処理するためにオーバーライドされ、メッセージの送信時に自動的にコールバックされます。 |
ポスト(実行可能) | Runnable オブジェクトをすぐに送信します。これは最終的に Message オブジェクトにカプセル化されます。 |
postAtTime(実行可能r、長い稼働時間ミリス) | Runnable オブジェクトを定期的に送信します。Runnable オブジェクトは最終的に Message オブジェクトにカプセル化されます。 |
postDelayed(実行可能) | Runnable オブジェクトの送信を遅延するミリ秒数。Runnable オブジェクトは最終的に Message オブジェクトにカプセル化されます。 |
sendEmptyMessage(int) | 空のメッセージを送信する |
sendMessage(メッセージメッセージ) | 今すぐメッセージを送信 |
s endMe ss ageAtTime (メッセージメッセージ、longuptimeMillis) | 定期的にメッセージを送信する |
sendMessageDelayed(メッセージ msg, longdelayMillis) | メッセージの送信を何ミリ秒遅らせるか |
(4) Looper(ループクラス)
Looper は、各スレッドの MessageQueue のスチュワードです。Looper のloop() メソッドを呼び出した後、ワイヤレス ループに入ります。その後、メッセージが MessageQueue で見つかるとすぐに、メッセージが取り出され、ハンドラーの HandlerMessage() メソッドに渡されます。
方法 | 説明する |
---|---|
準備する() | Looperの初期化に使用されます |
ループ() | looper スレッドは、loop() メソッドを呼び出した後、実際に動作し始め、メッセージ キューからメッセージを取得して処理します。 |
myLooper() | 現在のスレッドのLooperオブジェクトを取得できます |
getThread() | Looper オブジェクトが属するスレッドを取得するために使用されます |
やめる() | Looper ループを終了するために使用されます |
3. 使用する
単一のサブスレッドを例として挙げます: プログレスバー
1.UIデザイン
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ProgressBar
android:id="@+id/progress"
style="@android:style/Widget.ProgressBar.Horizontal"
android:layout_width="180dp"
android:layout_height="40dp"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true"
android:layout_marginEnd="111dp"
android:layout_marginBottom="382dp"
android:max="100" />
<TextView
android:id="@+id/math"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true"
android:layout_marginEnd="-5dp"
android:layout_marginBottom="387dp"
android:gravity="center"
android:textSize="25dp"
android:textColor="#F44336"/>
</RelativeLayout>
2. コードを実装する
final int TIME = 100;
final int TIME_GAS = 0x11;
float MATH = 0;
private ProgressBar time;
private int mTIME = 0;
ProgressBar progressBar;
TextView math;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
progressBar = findViewById(R.id.progress);
math = findViewById(R.id.math);
handler.sendEmptyMessage(TIME_GAS);
}
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
if (mTIME<TIME){
mTIME += 1;
MATH += 1;
String Imath = String.valueOf(MATH) + "%";
math.setText(Imath);
progressBar.setProgress(mTIME);
handler.sendEmptyMessageDelayed(TIME_GAS,10);
} else {
Toast.makeText(MainActivity.this,"进度完成!!",Toast.LENGTH_SHORT).show();
}
}
};
4. 付属品
git ダウンロード アドレス: https://gitee.com/xu-pq/android-demo/tree/master/Android_Handler