ルーパについて理解する必要があります。 Looperは適切なハンドラを参照して、スレッドのMessageQueueに関連付けられたMessageオブジェクトとRunnableオブジェクトを送信して処理します。ハンドラを呼び出すときにLooper.prepare()を呼び出す必要があります
デフォルトでは、スレッドにはメッセージループがありませんに関連付けられているため、ルーパーもありません。スレッド用のルーパーを作成し、そのスレッドをメッセージループからシリアルに処理するために、Looperクラスを使用することができます。
次は私のコードで私はルーパーを起動していない明示的に
Thread background2 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
final int v =i;
try { Thread.sleep(1000);
handler.post(new Runnable() {
@Override
public void run() {
txt.setText(txt.getText() + "Thread 2 current i : " + String.valueOf(v) +System.getProperty("line.separator"));
}
});
} catch (Exception e) {
Log.v("Error", e.toString());
}
}
}
});
それが実行可能なタスクが/キューに置かれていないことを意味していますか?それらの両方が同じハンドラにアクセスして、この
Thread background3 = new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();
for (int i = 0; i < 5; i++) {
final int v =i;
try { Thread.sleep(1000);
handler.post(new Runnable() {
@Override
public void run() {
txt.setText(txt.getText()+ "Thread 3 set : " + String.valueOf(v) +System.getProperty("line.separator"));
}
});
} catch (Exception e) {
Log.v("Error", e.toString());
}
}
Looper.loop();
}
});
と上記のコードの違いは何ですか。彼らはどちらもうまく動作します。
'Thread'は、あなたが求めているものなら、' Thread'の 'Handler'に' Looper'を投稿する必要はありません。あなたの例の 'Handler'は他の' Thread'sのものです。どちらの 'Thread'sを作成していてもかまいません。 –
こんにちは、私は今混乱していますので、私の2番目の例の違いは、明示的にLooper.prepare()を呼び出していますが、それがなくてもまだ動作します –
'Thread'の' Looper'を作成することは_other_ 'スレッド'はそれに投稿できます。あなたの例の 'Looper'は本当に何もしていません。あなたがそこに作成された' Handler'に何かを投稿していないからです。違いが見られません。 –