Looper.loop() android线程中的消息循环

Looper用于封装了android线程中的消息循环,默认情况下一个线程是不存在消息循环(message loop)的,需要调用Looper.prepare()来给线程创建一个消息循环,调用Looper.loop()来使消息循环起作用,从消息队列里取消息,处理消息。

注:写在Looper.loop()之后的代码不会被立即执行,当调用后mHandler.getLooper().quit()后,loop才会中止,其后的代码才能得以运行。Looper对象通过MessageQueue来存放消息和事件。一个线程只能有一个Looper,对应一个MessageQueue。


以下是Android API中的一个典型的Looper thread实现:

//Handler不带参数的默认构造函数:new Handler(),实际上是通过Looper.myLooper()来获取当前线程中的消息循环,
//而默认情况下,线程是没有消息循环的,所以要调用 Looper.prepare()来给线程创建消息循环,然后再通过,Looper.loop()来使消息循环起作用。


class LooperThread extends Thread
{
public Handler mHandler;
public void run()
{
Looper.prepare();
mHandler = new Handler()
{
public void handleMessage(Message msg)
{
// process incoming messages here
}
};
Looper.loop();
}


另,Activity的MainUI线程默认是有消息队列的。所以在Activity中新建Handler时,不需要先调用Looper.prepare()。

什么时候使用Looper.prepare()

当你的线程想拥有自己的MessageQueue的时候先Looper.prepare(),然后Looper.loop();

参照源码:

 

public static final void prepare() {    

       if (sThreadLocal.get() != null) {    

           throw new RuntimeException("Only one Looper may be created per thread");    

       }    

       sThreadLocal.set(new Looper());    

   }    

public static final void prepare() {   
       if (sThreadLocal.get() != null) {   
           throw new RuntimeException("Only one Looper may be created per thread");   
       }   
       sThreadLocal.set(new Looper());   
   }   



这段代码就是通过ThreadLocal来产生一个Looper对象做为线程局部变量,然后调用Looper.loop()则是取出Looper对象中的MessageQueue进行消息循环了,这样形成了这个线程的消息队列。
一般情况下只会有主线程会调用prepare方法(ActivityThread的main函数)。
 

使线程拥有自己的消息列队,主线程拥有自己的消息列队,一般线程创建时没有自己的消息列队,消息处理时就在主线程中完成,如果线程中使用Looper.prepare()和Looper.loop()创建了消息队列就可以让消息处理在该线程中完成

Looper用于封装了android线程中的消息循环,默认情况下一个线程是不存在消息循环(message loop)的,需要调用Looper.prepare()来给线程创建一个消息循环,调用Looper.loop()来使消息循环起作用,从消息队列里取消息,处理消息。

注:写在Looper.loop()之后的代码不会被立即执行,当调用后mHandler.getLooper().quit()后,loop才会中止,其后的代码才能得以运行。Looper对象通过MessageQueue来存放消息和事件。一个线程只能有一个Looper,对应一个MessageQueue。


以下是Android API中的一个典型的Looper thread实现:

//Handler不带参数的默认构造函数:new Handler(),实际上是通过Looper.myLooper()来获取当前线程中的消息循环,
//而默认情况下,线程是没有消息循环的,所以要调用 Looper.prepare()来给线程创建消息循环,然后再通过,Looper.loop()来使消息循环起作用。


class LooperThread extends Thread
{
public Handler mHandler;
public void run()
{
Looper.prepare();
mHandler = new Handler()
{
public void handleMessage(Message msg)
{
// process incoming messages here
}
};
Looper.loop();
}


另,Activity的MainUI线程默认是有消息队列的。所以在Activity中新建Handler时,不需要先调用Looper.prepare()。

什么时候使用Looper.prepare()

当你的线程想拥有自己的MessageQueue的时候先Looper.prepare(),然后Looper.loop();

参照源码:

public static final void prepare() {    

       if (sThreadLocal.get() != null) {    

           throw new RuntimeException("Only one Looper may be created per thread");    

       }    

        sThreadLocal.set(new Looper());    

   }    

public static final void prepare() {   
       if (sThreadLocal.get() != null) {   
           throw new RuntimeException("Only one Looper may be created per thread");   
       }   
       sThreadLocal.set(new Looper());   
   }   



这段代码就是通过ThreadLocal来产生一个Looper对象做为线程局部变量,然后调用Looper.loop()则是取出Looper对象中的MessageQueue进行消息循环了,这样形成了这个线程的消息队列。
一般情况下只会有主线程会调用prepare方法(ActivityThread的main函数)。
 

使线程拥有自己的消息列队,主线程拥有自己的消息列队,一般线程创建时没有自己的消息列队,消息处理时就在主线程中完成,如果线程中使用Looper.prepare()和Looper.loop()创建了消息队列就可以让消息处理在该线程中完成

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Looper.prepare()和Looper.loop()是Android消息循环机制的核心方法。Looper.prepare()用于创建当前线程消息循环对象,而Looper.loop()则用于启动消息循环,使得消息队列消息得以被处理。在Android,UI线程就是一个消息循环线程,通过Looper.prepare()和Looper.loop()的配合,可以实现UI线程消息循环机制,从而保证UI界面的流畅性和响应性。具体来说,Looper.prepare()会创建一个Looper对象,并将其存储在ThreadLocal,而Looper.loop()则会不断地从消息队列取出消息,并将其分发到对应的Handler进行处理。在消息处理完成后,Looper.loop()会继续等待下一个消息的到来,从而实现消息循环的效果。 ### 回答2: 在Java,Looper.prepare()和Looper.loop()是与Android消息循环机制相关的两个方法。 首先,Looper.prepare()方法是用来创建当前线程消息队列Looper对象。每个线程只能有一个Looper对象,用于处理该线程接收到的消息。在调用Looper.prepare()方法后,会创建一个Looper对象,并将其保存在ThreadLocal,以便该线程其他地方可以直接访问。一般来说,在创建Handler之前,需要先调用Looper.prepare()方法。 其次,Looper.loop()方法是调用当前线程消息循环机制。一旦调用该方法,程序就会进入一个无限循环的状态,不断地从消息队列取出消息并处理。在处理完一条消息后,继续取出下一条消息进行处理,以此类推。这个无限循环直到Looper对象调用了quit()方法,才会退出循环。 在Android开发,通常在主线程会调用Looper.prepare()和Looper.loop()方法来初始化和启动消息循环,以便接收并处理用户交互事件或其他异步事件。然后通过创建Handler对象,将需要处理的消息发送到消息队列,Looper.loop()方法会负责从消息队列轮询消息,并根据消息类型调用相应的Handler处理函数。 总之,Looper.prepare()方法创建当前线程消息队列,Looper.loop()方法负责启动消息循环并处理队列消息,这两个方法共同构成了Java利用消息队列实现消息循环机制的基础。 ### 回答3: 在Java,Looper.prepare()和Looper.loop()是Android系统的主要组件之一——消息循环机制(Message Loop Mechanism)的关键方法。消息循环机制是Android系统用来实现多线程之间通信的重要工具。 首先,Looper.prepare()的作用是在当前线程创建一个消息队列(Message Queue)和Looper对象。消息队列用于存储待处理的消息,而Looper对象则用于管理消息队列。每个线程最多只能有一个Looper对象,保证线程消息队列一一对应。 其次,Looper.loop()的作用是启动消息循环,开始不断地从消息队列取出消息并依次处理。该方法会一直循环执行,直到调用Looper.quit()方法停止消息循环。 具体来说,当调用Looper.prepare()方法时,会为当前线程创建一个消息队列,并通过ThreadLocal保存Looper对象。然后通过Looper.myLooper()方法可以获取当前线程的Looper对象。接下来,通过Looper.loop()方法启动消息循环,从消息队列获取消息,并传递给Handler进行处理。当消息队列为空时,Looper.loop()方法会进入休眠状态,等待新的消息进入队列。在消息循环期间,调用Looper.quit()方法可以停止消息循环,并释放相关资源。 通过消息循环机制,可以实现多线程间的异步通信。主线程通常会创建一个消息循环,用于处理UI事件和与用户交互的消息。在子线程,通过调用Looper.prepare()和Looper.loop()方法,可以为当前线程创建独立的消息队列,从而实现线程间的消息传递和任务调度。 总之,Looper.prepare()和Looper.loop()是Java实现消息循环机制的关键方法,前者用于创建消息队列和Looper对象,后者用于启动消息循环并处理消息。通过合理地使用消息循环机制,可以实现多线程之间的高效通信和任务调度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值