当前位置: 首页 > 知识库问答 >
问题:

每个Android线程都与Looper(消息队列)相关联?

封烈
2023-03-14

我正在尝试理解线程、处理程序、循环器。我看过视频,其中家伙说以下每个Android线程都与Looper(消息队列)相关联。所以这意味着当我创建Thread类实例时,它隐含地创建了它自己的连接到此线程的looper?还是这是错误的?Handler连接到创建它的线程,如果处理程序将发布消息的每个线程中没有looper?另一个问题是关于HandlerThread的。使用这个类的目的是什么,利弊是什么。希望您提前help.Thanks大家。

编辑 我想知道Looper是否与线程相关联,只需调用例如Thread myThread = new Thread();
或者,您应该为调用 Looper.prepare() 的线程指定显式 lopper;在您的线程中,又直接创建与调用 method 的线程关联的新 looper 实例。正如我在Looper类的源代码中看到的那样,它调用ThreadLocal.get in prepare,它在哪里获取当前线程。所以结论是默认情况下没有与简单线程关联的循环器?我说的对吗?我还注意到,处理程序的所有构造函数都调用处理程序(回调回调,布尔异步)。Looper.myLooper();调用方法。因此,正如我所理解的那样,这意味着遵循。

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

这里没有一个弯针与线相关联。下一个例子。

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

在这里,处理程序将在创建新的处理程序实例时与循环器直接关联。下一个示例。

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

在这个例子中,loooper将被创建为通过调用准备方法来显式地创建。我是对的吗?请评论。

编辑 2

第二个例子将导致

java.lang.RuntimeException:无法在未调用循环器的线程内创建处理程序。prepare()这样的异常,所以结论是只有调用了Looper.prepare()的线程

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

共有2个答案

濮阳景天
2023-03-14

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

壤驷康裕
2023-03-14

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

 类似资料:
  • 主要内容:1. 什么是消息队列,2. 消息队列有哪些使用场景,3. 消息队列如何解决消息丢失问题,4. 消息队列如何保证消息的顺序性,5. 如何保证数据一致性,事务消息如何实现1. 什么是消息队列 你可以把消息队列理解为一个使用队列来通信的组件。它的本质,就是个转发器,包含发消息、存消息、消费消息的过程。最简单的消息队列模型如下: 我们通常说的消息队列,简称MQ(Message Queue),它其实就指消息中间件,当前业界比较流行的开源消息中间件包括:RabbitMQ、RocketMQ、Kafk

  • 问题内容: 我有一个简单的线程是这样的: 编辑:开始运行的附加代码 它是主要活动的内部类。但是, 此线程 不是在主 活动 上 运行,而是在 另一个 在 主 活动上 运行的线程 内部 运行 。 无论如何,此示例与此处 完全相同 ,但是由于某种原因,它给了我java.lang.RuntimeException:每个线程只能创建一个Looper。 我没有创建任何其他循环程序,至少在任何地方都没有。 问题

  • 似乎(至少是用)创建的looper不会被垃圾收集,即使其他代码没有引用。我知道和方法,但是在我的应用程序中,我不确定谁将负责调用这些方法之一。 在具有多个活动的应用程序中关闭的正确方法是什么,并且在此上创建的的生命周期与其中的活动不同。它不能是任何活动的。如果我不关闭它,并且进程没有被OS杀死-新的可能会在下一个应用程序“启动”时创建,而这个将会泄漏。或者,创建一次,存储在一个静态字段,从不退出,

  • 为什么已经拥有了共享内存时需要消息队列呢? 这将是多种原因,让我们将其分解为多个点来简化 - 据了解,一旦消息被一个进程接收到,它将不再可用于任何其他进程。 而在共享内存中,数据可供多个进程访问。 如果想使用小信息格式进行通信。 当多个进程同时进行通信时,共享内存数据需要同步保护。 使用共享内存的写入和读取频率很高,那么实现功能将会非常复杂。 在这种情况下不值得使用。 如果所有的进程不需要访问共享

  • 一、消息模型 点对点 发布/订阅 二、使用场景 异步处理 流量削锋 应用解耦 三、可靠性 发送端的可靠性 接收端的可靠性 参考资料 一、消息模型 点对点 消息生产者向消息队列中发送了一个消息之后,只能被一个消费者消费一次。 发布/订阅 消息生产者向频道发送一个消息之后,多个消费者可以从该频道订阅到这条消息并消费。 发布与订阅模式和观察者模式有以下不同: 观察者模式中,观察者和主题都知道对方的存在;

  • 一个线程会从消息队列中收取消息,另一个线程会定时给消息队列发送普通消息和紧急消息 一个线程会从消息队列中收取消息,另一个线程会定时给消息队列发送普通消息和紧急消息 源码/* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: *