为什么后台线程会产生自己的Handler&尺蠖

时间:2016-09-07 12:15:54

标签: android android-handlerthread

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

  • Looper:在消息队列中循环并执行任务

  • 处理程序:将任务发布到队列

看看我从互联网上的文章中获取的这个片段

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线程处理程序并通过处理程序发布runnable。

 mWorkerHandler = new Handler(getLooper());

创建自己的looper(后台线程的looper),表示后台线程创建自己的Message Queue。不应该只是玩主线程的消息队列而不是后台线程。

提前致谢。

1 个答案:

答案 0 :(得分:0)

我无法在互联网上保证随机文章,但此代码正确使用处理程序。

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

private Handler mUiHandler = new Handler();

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

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

这些行将Runnable发布到后台线程:

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

因此简而言之,后台线程会使用looper和处理程序,原因与UI线程使用它们相同:因此其他线程上的代码可以将消息和runnable发布到它。