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

时间:2016-07-07 01:46:52

标签: android multithreading android-looper

我需要了解 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());
                    }
                }

            }
        });

是否意味着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();
            }
        });

他们都访问相同的处理程序。他们都工作正常。

1 个答案:

答案 0 :(得分:2)

Looper创建Thread表示您正在设置Thread以接收来自其他Thread的消息。您的两个示例都表现完全相同,因为您没有向第二个示例中的Thread发送任何内容。也就是说,background3的{​​{1}}并未真正使用。

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

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

Looper不需要Thread只需发布到另一个 Thread的处理程序,这就是您的示例所做的一切。另一个Thread - 主Looper,在这种情况下 - 已经准备并启动了它的Runnable。您只需向Looper发送public IQueryable<UserDto> GetAllUser() { return _context.User.Select(u => new UserDto{FirstName=u.FirstName, LastName=u.LastName, Organisation="Acme"}); } ,而您自己不需要DROP PROCEDURE IF EXISTS `my_test`; CREATE PROCEDURE `my_test`( IN my_in_var VARCHAR(255), OUT my_out_var VARCHAR(255) ) BEGIN IF(in_var == 'my_in_value') THEN SET my_out_var = 'my_out_value1'; ELSE SET my_out_var = 'my_out_value2'; END IF; END