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



我需要了解Looper。Looper 将咨询适当的处理程序来发送和处理与线程的 MessageQueue 关联的消息和可运行对象。

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

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

这是否意味着任务/可运行对象没有放入队列中? 上面的代码

与此有什么区别
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并没有真正被使用。

在这两个示例中,您都将Runnable发布到为主Thread Looper创建的Handler。您不是在为例如background2创建该Handler。该Handler属于主Thread及其Looper,您发布到它的任何内容都将放入主队列,并在主Thread上运行。

您的示例中唯一的区别是第二个Thread有一个 Looper ,如果您愿意,您可以发布到它。为此,您需要创建另一个属于background3 LooperHandler,并发布到该。但是,您没有这样做,因此第二个Thread只是继续运行而不执行任何其他操作。

一个Thread不需要一个Looper来简单地发布到另一个Thread的处理程序,这实际上是你的示例所做的一切。另一个Thread - 主要Thread ,在这种情况下 - 已经准备好并开始Looper.你只是向它发送Runnable,你不需要自己的Looper来做到这一点。

相关内容

  • 没有找到相关文章

最新更新