为什么后台线程会生成自己的 Handler 和 Looper

Why would a background thread spawn its own Handler & Looper

为什么后台线程会产生自己的 Handler 和 Looper 只是为了修改 UI 的组件。我知道简单来说:

看看我从互联网文章中摘录的这个片段

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中缺乏线程基础。所以我很抱歉。

后台线程基本上是重复自己(两次)。主要思想是通过后台线程操作UI组件。

看看这个:

mWorkerHandler

为什么后台线程会创建自己的处理程序,如果它是一个操作问题 UI 的组件,为什么它不引用 UI 线程处理程序并发布可运行的通过处理程序。

 mWorkerHandler = new Handler(getLooper());

which is creating its own looper(background thread's looper),说明后台线程在创建自己的Message Queue。难道不应该只是玩弄主线程的消息队列而不是后台线程吗?

提前致谢。

我不能保证 Internet 上的随机文章,但这段代码正确使用了处理程序。

这一行创建了一个在 UI 线程上运行代码的处理程序:

private Handler mUiHandler = new Handler();

此方法创建一个在后台线程中运行代码的处理程序:

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

这些行post后台线程的Runnable:

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

所以简而言之,后台线程会使用循环程序和处理程序,原因与 UI 线程使用它们的原因相同:因此其他线程上的代码可以 post 向它发送消息和可运行程序。