Looper.prepare()方法和Looper.loop()是干啥的

在Android开发中,Looper类是与线程以及消息处理紧密相关的一个类。它管理着一个消息队列(MessageQueue),允许你发送和处理Message和Runnable对象。Looper.prepare()和Looper.loop()是Looper类中两个非常重要的方法,它们的作用分别如下:

  1. Looper.prepare()
    Looper.prepare()方法用于在当前线程中初始化一个Looper对象,并为该线程创建一个消息队列(如果尚未创建的话)。这个方法通常被调用在线程的run()方法开始处,以表明这个线程将是一个Looper线程,即这个线程将运行一个消息循环,用于接收和处理消息和Runnable对象。

需要注意的是,Looper.prepare()在一个线程中只能被调用一次,因为每个线程只能有一个Looper和一个消息队列。

  1. Looper.loop()
    Looper.loop()方法会启动Looper的事件循环。一旦调用此方法,当前线程就会进入一个无限循环,不断地从消息队列中取出消息(Message)或Runnable对象,并分发它们给相应的Handler进行处理。这个过程会一直持续下去,直到调用Looper.quit()或Looper.quitSafely()方法来停止Looper的循环。

典型用法
在Android中,UI线程(主线程)默认已经有一个Looper在运行,因此不需要在UI线程中显式调用Looper.prepare()和Looper.loop()。但是,如果需要在一个新!的!线!程!中处理消息,你就需要手动调用这两个方法。以下是一个简单的示例:

public class MyThread extends Thread {  
    private Handler handler;  
  
    @Override  
    public void run() {  
        Looper.prepare(); // 初始化Looper和消息队列  
  
        handler = new Handler() {  
            @Override  
            public void handleMessage(Message msg) {  
                // 处理消息  
                // 你可以在这里执行后台任务或者更新UI(如果这是主线程的Handler)  
            }  
        };  
  
        Looper.loop(); // 启动消息循环  
    }  
  
    // 提供一个公共方法来获取Handler  
    public Handler getHandler() {  
        return handler;  
    }  
}  


  
// 在其他线程中发送消息  
public class OtherThread extends Thread {  
    private MyThread myThread;  
  
    public OtherThread(MyThread myThread) {  
        this.myThread = myThread;  
    }  
  
    @Override  
    public void run() {  
        // 确保myThread已经启动并且Looper已经准备好  
        if (myThread.isAlive() && myThread.getHandler() != null) {  
            Handler handler = myThread.getHandler();  
            // 发送消息  
            handler.sendEmptyMessage(0); // 发送一个空消息,消息码为0  
  
            // 或者创建一个Message对象并发送它  
            Message message = Message.obtain();  
            message.what = 1; // 设置消息码为1  
            handler.sendMessage(message); // 发送消息  
        }  
    }  
}  
  


// 在主线程或其他地方创建和启动线程  
public class MainActivity extends AppCompatActivity {  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
  
        MyThread myThread = new MyThread();  
        myThread.start();  
  
        OtherThread otherThread = new OtherThread(myThread);  
        otherThread.start();  
    }  
}

在这个例子中,MyThread类重写了run()方法,并在其中调用了Looper.prepare()来初始化Looper和消息队列,然后创建了一个Handler用于处理消息。最后,通过调用Looper.loop()来启动消息循环,这样该线程就能够接收和处理消息了。

在其他线程中,需要确保在发送消息之前MyThread的Looper已经准备好
如果先发送消息到handler,然后再启动Looper.loop(),那么消息不会被立即处理。Handler是用于发送和处理Message或Runnable对象的,它依赖于Looper来管理消息队列。在调用Looper.loop()之前,消息队列并没有被启动,因此发送到handler的消息会停留在队列中,等待Looper开始循环后才会被处理。

要正确处理消息,你需要先调用Looper.prepare()来初始化Looper和消息队列,然后启动Looper.loop()来开始消息循环,最后再通过handler发送消息。这样,发送的消息才会被Looper捕获并分发给handler进行处理。

总结一下,正确的顺序应该是:

调用Looper.prepare()来准备Looper和消息队列。
创建handler并将其与Looper关联。
调用Looper.loop()来启动消息循环。
通过handler发送消息。

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值