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

本文详细介绍了Android中的Looper机制,包括如何通过Looper.prepare()为线程创建消息循环,以及Looper.loop()的作用。此外,还提供了典型的LooperThread实现示例,并解释了何时需要使用Looper.prepare()。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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());   
   }   



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

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

http://blog.csdn.net/lwuit/article/details/6796464

在Java中,特别是在Android开发中,`Looper`类用于处理线程消息队列。`Looper.myLooper()`方法用于获取当前线程的`Looper`对象,而`Looper.loop()`方法则用于启动消息循环。以下是详细解释: 1. **Looper.myLooper()**: - 这个方法返回与当前线程关联的`Looper`对象。如果当前线程没有关联的`Looper`,则返回`null`。 - `Looper`对象包含一个消息队列(MessageQueue),用于存储待处理的消息。 2. **Looper.loop()**: - 这个方法用于启动消息循环。它会不断地从消息队列中取出消息,并将其分派给相应的处理程序(Handler)。 - 消息循环会一直运行,直到调用`Looper.quit()`或`Looper.quitSafely()`方法。 以下是一个简单的示例,展示了如何使用`Looper.myLooper()`和`Looper.loop()`: ```java class LooperThread extends Thread { public Handler mHandler; public void run() { // 初始化Looper Looper.prepare(); // 创建Handler并关联到当前线程Looper mHandler = new Handler() { public void handleMessage(Message msg) { // 处理消息 System.out.println("Received message: " + msg.what); } }; // 获取当前线程Looper对象 Looper myLooper = Looper.myLooper(); // 启动消息循环 Looper.loop(); } } public class Main { public static void main(String[] args) { LooperThread looperThread = new LooperThread(); looperThread.start(); // 等待线程启动 try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } // 发送消息Looper线程 looperThread.mHandler.sendEmptyMessage(1); } } ``` 在这个示例中: 1. `LooperThread`类继承自`Thread`,在`run`方法中初始化`Looper`并启动消息循环。 2. `Handler`对象用于处理消息。 3. `Looper.myLooper()`获取当前线程的`Looper`对象。 4. `Looper.loop()`启动消息循环。 5. 在`Main`类的`main`方法中,启动`LooperThread`线程并发送消息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值