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

时间:2014-08-10 08:34:12

标签: java android multithreading

我试图了解线程,处理程序,loopers。我看过那个人说跟随每个Android线程与Looper(Message Queue)相关联的视频。这意味着当我创建Thread类实例时,它隐含地创建了自己的looper并连接到这个线程?或者这是错的?如果处理程序将发布消息的每个线程中没有looper,Handler会连接到创建它的线程吗? 另一个问题是关于HandlerThread。目的是什么以及使用这门课程的利弊是什么。 我希望得到你的帮助。谢谢大家。

修改 我想知道Looper在调用之后是否与线程相关联  Thread myThread = new Thread();
或者你应该为线程调用Looper.prepare();指定explictly lopper;在你的线程中依次隐含地创建与调用方法的线程相关联的looper的新实例。正如我在Looper类的源代码中看到的那样,它调用ThreadLocal.get来准备它获取当前线程的位置。所以结论是默认情况下没有与简单线程关联的looper?我对吗 ? 我还注意到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将与looper相关联。 下一个例子。

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

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

编辑2

第二个例子将导致

  

java.lang.RuntimeException:无法在线程内创建处理程序   没有调用Looper.prepare()这样的例外,所以结论是这样的   只有调用了Looper.prepare()

的线程

将拥有它自己的Looper,否则在这样的线程中创建处理程序时会导致异常。

2 个答案:

答案 0 :(得分:2)

通过调用Looper.prepare(),线程与消息队列相关联。随后在该线程中创建的任何Handler将与同一消息队列相关联。线程通过调用Looper.loop()开始处理其消息队列。除了处理自己的消息队列外,looper线程通常不会做任何事情。

答案 1 :(得分:0)

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