2

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

默认情况下,线程没有与之关联的消息循环,因此也没有 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();
            }
        });

他们都访问同一个处理程序。他们都工作正常。

4

1 回答 1

2

Looper为 a创建 aThread意味着您正在设置它Thread以接收来自其他Threads 的消息。您的两个示例的行为完全相同,因为Thread在第二个示例中您没有向 the 发送任何内容。也就是说,background3'sLooper并没有真正被使用。

在这两个示例中,您将 a 发布RunnableHandler为 main 创建的Threada Looper。您不是Handler为例如background2. 那Handler属于 mainThread和它的Looper,你发布到它的任何东西都将被放入 main 队列,并在 main 上运行Thread

您的示例中唯一的区别是第二个Thread有一个Looper,如果您愿意,您可以发布到它。为此,您将创建另一个Handler属于background3's 的Looper内容,然后发布到该内容。但是,您并没有这样做,因此第二个Thread只是继续运行而不做任何其他事情。

AThread不需要 aLooper简单地发布到另一个 ThreadHandler,这实际上是您的示例所做的一切。那个其他Thread-Thread在这种情况下是主要的 - 已经准备好并开始了它的Looper。您只是向Runnable它发送 s,而您不需要Looper自己的 a 来执行此操作。

于 2016-07-07T03:14:11.040 回答