繁体   English   中英

每个Android线程都与Looper(Message Queue)相关联?

[英]Each Android thread is associated with Looper(Message Queue)?

我想了解线程,处理程序,循环程序。 我观看了视频,视频中的家伙说以下每个Android线程都与Looper(Message Queue)相关联。 这就是说,当我创建Thread类实例时,是隐式地创建了自己的循环程序,该循环程序连接到该线程吗? 还是这是错误的? 处理程序连接到创建它的线程,如果每个线程中没有循环程序,处理程序将在其中发布消息? 另一个问题是关于HandlerThread。 使用此类的目的是什么,什么是利弊。 希望对您有所帮助。

编辑我想知道Looper是否仅在调用例如Thread myThread = new Thread();之后与线程关联Thread myThread = new Thread();
或者,您应该为线程调用Looper.prepare();明确指定lopper。 在您的线程中反过来隐式创建与已调用方法的线程关联的循环程序的新实例。 正如我在Looper类的源代码中看到的那样,它在准备获取当前线程的位置中调用ThreadLocal.get。 因此,结论是默认情况下没有与简单线程关联的循环程序吗? 我对吗 ? 而且我还注意到Handler的所有构造函数都调用Handler(Callback callback,boolean async)。 Looper.myLooper(); 方法被调用。 因此,据我了解,这意味着关注。

Thread myThread = new Thread(new Runnable() {
public void run() {
//some stuff here 
}
});
myThread.start();

这里没有Looper与线程相关联。 下一个例子。

  Thread myThread = new Thread(new Runnable() {
    public void run() {
     Handler myHandler = new Handler();
    }
    });
    myThread.start();

在这里,在创建Handler的新实例时,Handler将隐式与循环器关联。 下一个例子。

 Thread myThread = new Thread(new Runnable() {
        public void run() {
         Looper.prepare();
        }
        });
        myThread.start();

在此示例中,将通过调用prepare方法显式创建loooper。 我是正确的 ? 请评论。

编辑2

第二个例子将导致

java.lang.RuntimeException:无法在未调用Looper.prepare()这样的异常的线程内创建处理程序,因此得出的结论是,只有已调用Looper.prepare()的线程

; 将拥有自己的Looper,否则将在此类线程中创建处理程序时导致异常。

通过调用Looper.prepare()线程将与消息队列关联。 随后在该线程中创建的任何Handler都将与同一消息队列关联。 线程通过调用Looper.loop()开始处理其消息队列。 循环程序线程通常不执行任何操作,除非处理其自己的消息队列。

据我了解,Looper和Handler只是帮助程序类,可轻松处理线程中的生成和消息。 但是线程除了处理消息外还能做任何事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM