调用Handler时是否需要调用Looper.prepare()

Do we need invoking Looper.prepare() when invoking Handler

我需要了解 Looper。 Looper 将参考适当的 handler 来发送和处理与线程的 MessageQueue 关联的 Message 和 Runnable 对象。

默认情况下,线程没有与之关联的消息循环,因此也没有 Looper。要为线程创建 Looper 并使该线程专用于从消息循环中串行处理消息,您可以使用 Looper class.

以下是我的代码我没有显式调用 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());
                    }
                }

            }
        });

是否表示task/runnable没有放入队列?上面的代码和这个有什么区别

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 创建 Looper 意味着您正在设置 Thread 以接收来自其他 Thread 的消息。您的两个示例的行为完全相同,因为您没有向第二个示例中的 Thread 发送任何内容。也就是说,background3Looper 并没有真正被使用。

在这两个示例中,您都post将 Runnable 转换为 Handler,后者是为主要 ThreadLooper 创建的。您不是为 background2 创建 HandlerHandler 属于主 Thread 和它的 Looper,任何你 post 到它的东西都会被放入主队列,而 运行 在主队列中Thread.

你的例子中唯一的区别是第二个 Thread 有一个 Looper,你 可以 post 到它,如果你想。为此,您将创建另一个属于 background3LooperHandler,以及 post 的 post。但是,您没有这样做,所以第二个 Thread 只是继续 运行,没有做任何其他事情。

A Thread 不需要 Looper 只需 post 到 另一个 Thread 的处理程序,它真的是你的例子所做的一切。另一个 Thread - 主要 Thread,在这种情况下 - 已经准备好并开始其 Looper。您只需向它发送 Runnable,您不需要自己的 Looper 即可。