UIのコンポーネントを変更するためだけに、バックグラウンドスレッドが独自のハンドラーとルーパーを生成するのはなぜですか。簡単に言えば、次のことを知っています。
Looper : メッセージ キュー内のタスクをループして実行する
Handler : タスクをキューに投稿する
インターネットの記事から取ったこのスニペットを見てください
public class MyActivityV2 extends Activity {
private Handler mUiHandler = new Handler();
private MyWorkerThread mWorkerThread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mWorkerThread = new MyWorkerThread("myWorkerThread");
Runnable task = new Runnable() {
@Override
public void run() {
for (int i = 0; i < 4; i++) {
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (i == 2) {
mUiHandler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(MyActivityV2.this,
"I am at the middle of background task",
Toast.LENGTH_LONG)
.show();
}
});
}
}
mUiHandler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(MyActivityV2.this,
"Background task is completed",
Toast.LENGTH_LONG)
.show();
}
});
}
};
// MyWorkerThread == HandlerThread
mWorkerThread.start();
mWorkerThread.prepareHandler();
// 2 starting of thread
mWorkerThread.postTask(task);
mWorkerThread.postTask(task);
}
@Override
protected void onDestroy() {
mWorkerThread.quit();
super.onDestroy();
}
}
//MyWorkerThread.java
class MyWorkerThread extends HandlerThread {
private Handler mWorkerHandler;
public MyWorkerThread(String name) {
super(name);
}
public void postTask(Runnable task){
mWorkerHandler.post(task);
}
public void prepareHandler(){
mWorkerHandler = new Handler(getLooper());
}
}
コードを完全に誤解しているか、Android のスレッド基盤が不足しています。申し訳ありません。
バックグラウンド スレッドは、基本的にそれ自体を (2 回) 繰り返します。主なアイデアは、バックグラウンド スレッドを介して UI コンポーネントを操作することです。
これを見てください:
mWorkerHandler
バックグラウンドスレッドが独自のハンドラーを作成するのはなぜですか。それがUIのコンポーネントの操作の問題である場合、UIスレッドハンドラーの参照とハンドラーを介して実行可能な投稿を取得しないのはなぜですか。
と
mWorkerHandler = new Handler(getLooper());
これは独自のルーパー (バックグラウンド スレッドのルーパー) を作成しています。これは、バックグラウンド スレッドが独自のメッセージ キューを作成していることを示します。バックグラウンドスレッドではなく、メインスレッドのメッセージキューをいじるだけではいけません。
前もって感謝します。