【Android】app中阻塞的looper为什么可以响应touch事件

这篇具有很好参考价值的文章主要介绍了【Android】app中阻塞的looper为什么可以响应touch事件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这里,我们考虑一个问题,Android中的应用是一个looper线程,没有任务时就阻塞着,其他线程通过handler调用等方式向主线程looper发送任务,

【Android】app中阻塞的looper为什么可以响应touch事件,Android Input系统,Android,Android

如果点击应用上的按钮,应用是怎么及时响应的呢,

是专门启动了一个额外的线程去监控input事件么?

这里直接给出答案,input事件传送给了系统IMS,IMS通过inputchannel把input传送给应用,而应用中的主线程looper监控了inputchannel的fd,

这里看一下主线程looper是怎么实现的监控inputchannel的fd。

在应用创建的时候,会调用ViewRootImpl的serView方法,

frameworks/base/core/java/android/view/ViewRootImpl.java

setView

mInputEventReceiver = new WindowInputEventReceiver(inputChannel,

Looper.myLooper());

这里传入了主线程的looper给WindowInputEventReceiver

这个构造方法,调用其父类的构造

public InputEventReceiver(InputChannel inputChannel, Looper looper) {

if (inputChannel == null) {

throw new IllegalArgumentException("inputChannel must not be null");

}

if (looper == null) {

throw new IllegalArgumentException("looper must not be null");

}

mInputChannel = inputChannel;

mMessageQueue = looper.getQueue();

mReceiverPtr = nativeInit(new WeakReference<InputEventReceiver>(this),

mInputChannel, mMessageQueue);

mCloseGuard.open("InputEventReceiver.dispose");

}

static jlong nativeInit(JNIEnv* env, jclass clazz, jobject receiverWeak,

jobject inputChannelObj, jobject messageQueueObj) {

std::shared_ptr<InputChannel> inputChannel =

android_view_InputChannel_getInputChannel(env, inputChannelObj);

if (inputChannel == nullptr) {

jniThrowRuntimeException(env, "InputChannel is not initialized.");

return 0;

}

sp<MessageQueue> messageQueue = android_os_MessageQueue_getMessageQueue(env, messageQueueObj);

if (messageQueue == nullptr) {

jniThrowRuntimeException(env, "MessageQueue is not initialized.");

return 0;

}

sp<NativeInputEventReceiver> receiver = new NativeInputEventReceiver(env,

receiverWeak, inputChannel, messageQueue);

status_t status = receiver->initialize();

其中,receiver->initialize();

调用到

status_t NativeInputEventReceiver::initialize() {

setFdEvents(ALOOPER_EVENT_INPUT);

return OK;

}

void NativeInputEventReceiver::setFdEvents(int events) {

if (mFdEvents != events) {

mFdEvents = events;

auto&& fd = mInputConsumer.getChannel()->getFd();

if (events) {

mMessageQueue->getLooper()->addFd(fd.get(), 0, events, this, nullptr);

} else {

mMessageQueue->getLooper()->removeFd(fd.get());

}

}

这里,打不过就加入,把inputchannel的fd也加入到主线程looper的epool监控之中。文章来源地址https://www.toymoban.com/news/detail-816053.html

到了这里,关于【Android】app中阻塞的looper为什么可以响应touch事件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 20 信任链:为什么可以相信一个 HTTPS 网站?

    现实的生活当中,如果想证明一份合同没有被修改过,人们会在合同上盖一个齐缝章,并附上自己的签名。签名和盖章其实是一个含义,目的是证明自己签署过某份协议,而且一经签署,协议就不能再变更。 如果想阻止一份合同被修改,最容易想到的方式是加密 。合同一旦

    2024年02月21日
    浏览(47)
  • 电脑显卡驱动停止响应该怎么办?为什么会出现这种情况

    当你电脑突然弹框说显卡驱动停止响应,你知道是出现什么问题了吗,下面我们为大家总结了有可能造成显卡驱动停止响应的原因。 1.    过热: 显卡在长时间高负载下可能会过热,导致驱动停止响应。过高的温度可能损坏显卡或导致系统不稳定。 2.    显卡驱动问题:

    2024年02月04日
    浏览(30)
  • 提问:为什么postman 里没有cookie 也能获取无安全验证的响应?

    为什么 使用postman发送请求和用python request 发起请求,都没有使用cookie但是在postman 中可以获取百度手机号的响应,但是python request 不能,而是得到一个安全验证界面。 已经经Disable cookie jar了,且删除了响应cookies 缓存。 欢迎下面发表您的见解~

    2024年02月12日
    浏览(42)
  • Linux中vim为什么直接可以操作jar包

    今天上线遇到了令人迷惑的问题,宽哥大佬排查的时候用vim直接查看了jar包,感觉很神奇,所以查了查资料; 学无止境!! JAR 文件的本质: JAR(Java ARchive)文件是 Java 平台上用于封装 Java 类文件、相关的元数据和资源文件的压缩包。JAR 文件使用了 ZIP 文件格式进行压缩和存

    2023年04月26日
    浏览(45)
  • 路由器劫持是什么意思为什么要劫持路由器有哪些方法可以防范

    继“棱镜门”事件之后,网络安全也随之被各大媒体关注,近段时间有不少媒体报道,全球拥有大量的路由器遭入侵、路由器被劫持等等。另外在如今越来越多的无线网络环境中,蹭网也是常常被人们提及,那么路由器劫持是什么意思?怎么看路由器是否被劫持?针对这两个

    2024年02月07日
    浏览(55)
  • MySQL可重复读隔离级别下,乐观锁为什么可以生效?

    今天蹦出一个很蠢的问题,来记录一下 MySQL在可重复读事务隔离级别下,通过版本号实现的乐观锁可以生效吗? 举个例子:开启了两个事务一和二,在事务一中对某条数据进行了修改,版本号发生变化。但是在事务二中,查询这条记录的版本号,并没有发生变化,怎么确定这

    2024年02月07日
    浏览(32)
  • 为什么网络可以ping通,还是不能ssh到目标主机?

      做运维工作,我们都是通过远程的方式去连接一台服务器或者虚拟机,很多初次做运维的朋友可能经常会遇到这样一个问题:我ping目标服务器的IP是通的,但是我通过ssh却不能连上主机。今天,就来浅谈一下,为什么你ping网络是通的,但是却不能连接到远程主机,当你弄

    2024年02月09日
    浏览(36)
  • 手机wifi可以连接路由器但是上不了网,为什么?

    本文转载自:路由器知识库:www.luyouqiset.cn 详细介绍无线路由器设置后却上不了网的解决办法。但我们拿到路由器后一般都是按照说明书,一步一步登陆后台去设置无线路由器。结果辛辛苦苦设置完后,发现手机,笔记本电脑都够连接到tplink路由器的网络但上不了网。气愤到先

    2024年02月11日
    浏览(74)
  • 为什么说云蜜罐可以让安全防御工作由被动变主动

    蜜罐技术本质上是一种对攻击方进行欺骗的技术,通过布置一些作为诱饵的主机、网络服务或者信息,诱使攻击方对它们实施攻击,从而可以对攻击行为进行捕获和分析,了解攻击方所使用的工具与方法,推测攻击意图和动机,能够让防御方清晰地了解他们所面对的安全威胁

    2024年04月10日
    浏览(28)
  • 0062__对象指针为NULL,为什么还是可以调用成员函数

    对象指针为NULL,为什么还是可以调用成员函数_空对象指针为什么能调用函数_一颗石头崽儿的博客-CSDN博客

    2024年02月10日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包