0

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());

これは独自のルーパー (バックグラウンド スレッドのルーパー) を作成しています。これは、バックグラウンド スレッドが独自のメッセージ キューを作成していることを示します。バックグラウンドスレッドではなく、メインスレッドのメッセージキューをいじるだけではいけません。

前もって感謝します。

4

1 に答える 1

0

インターネット上のランダムな記事を保証することはできませんが、このコードはハンドラーを正しく使用しています。

この行は、UI スレッドでコードを実行するハンドラーを作成します。

private Handler mUiHandler = new Handler();

このメソッドは、バックグラウンド スレッドでコードを実行するハンドラーを作成します。

public void prepareHandler(){
  mWorkerHandler = new Handler(getLooper());
}

これらの行は、Runnable をバックグラウンド スレッドにポストします。

mWorkerThread.postTask(task);
mWorkerThread.postTask(task);

簡単に言えば、バックグラウンド スレッドは、UI スレッドがルーパーとハンドラーを使用するのと同じ理由でルーパーとハンドラーを使用します。そのため、他のスレッドのコードがメッセージとランナブルを投稿できます。

于 2016-09-07T12:36:13.330 に答える