千家信息网

Android构造函数怎么实现

发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,本篇内容介绍了"Android构造函数怎么实现"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!简单来说
千家信息网最后更新 2025年11月08日Android构造函数怎么实现

本篇内容介绍了"Android构造函数怎么实现"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

简单来说,管道就是一个文件,在管道的两端,分别是两个打开文件文件描述符,这两个打开文件描述符都是对应同一个文件, 其中一个是用来读的,别一个是用来写的,一般的使用方式就是,一个线程通过读文件描述符中来读管道的内容,当管道没有内容时,这个线程就会进入等待状态, 而另外一个线程通过写文件描述符来向管道中写入内容,写入内容的时候,如果另一端正有线程正在等待管道中的内容,那么这个线程就会被唤醒。

这个等待和唤醒 的操作是如何进行的呢,这就要借助Linux系统中的epoll机制了。

Linux系统中的epoll机制为处理大批量句柄而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著减 少程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。

但是这里我们其实只需要监控的IO接口只有mWakeReadPipeFd一个,即前面我们所创建的管道的读端,为什么还需要用到epoll呢?有点用牛刀来杀鸡的味道。

其实不然,这个Looper类是非常强大的,它除了监控内部所创建的管 道接口之外,还提供了addFd接口供外界面调用,外界可以通过这个接口把自己想要监控的IO事件一并加入到这个Looper对象中去,当所有这些被监控 的IO接口上面有事件发生时,就会唤醒相应的线程来处理,不过这里我们只关心刚才所创建的管道的IO事件的发生。

我们再回到NativeMessageQueue的构造函数中,看看JNI层的Looper对象的创建过程,即看看它的构造函数是如何实现的,这个Looper类实现在frameworks/base/libs/utils/Looper.cpp文件中:

[cpp] view plaincopyLooper::Looper(bool allowNonCallbacks) : mAllowNonCallbacks(allowNonCallbacks), mResponseIndex(0) { int wakeFds[2]; int result = pipe(wakeFds); ...... mWakeReadPipeFd = wakeFds[0]; mWakeWritePipeFd = wakeFds[1]; ...... #ifdef LOOPER_USES_EPOLL // Allocate the epoll instance and register the wake pipe. mEpollFd = epoll_create(EPOLL_SIZE_HINT); ...... struct epoll_event eventItem; memset(& eventItem, 0, sizeof(epoll_event)); // zero out unused members  data field union eventItem.events = EPOLLIN; eventItem.data.fd = mWakeReadPipeFd; result = epoll_ctl(mEpollFd, EPOLL_CTL_ADD, mWakeReadPipeFd, & entItem); ...... #else ...... #endif ...... }

这个构造函数做的事情非常重要,它跟我们后面要介绍的应用程序主线程在消息队列中没有消息时要进入等待状态以及当消息队列有消息时要把应用程序主线程唤醒的这两个知识点息息相关。它主要就是通过pipe系统调用来创建了一个管道了:

  1. [cpp] view plaincopyint wakeFds[2];

  2.  int result = pipe(wakeFds);

  3.  ......

  4.  mWakeReadPipeFd = wakeFds[0];

  5.  mWakeWritePipeFd = wakeFds[1];

要使用Linux系统的epoll机制,首先要通过epoll_create来创建一个epoll专用的文件描述符:

[cpp] view plaincopymEpollFd = epoll_create(EPOLL_SIZE_HINT);

传入的参数EPOLL_SIZE_HINT是在这个mEpollFd上能监控的***文件描述符数。

"Android构造函数怎么实现"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

文件 管道 线程 内容 接口 函数 系统 监控 消息 两个 事件 就是 机制 知识 程序 只有 对象 应用程序 情况 更多 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 小学四年级网络安全日记 网络安全形式分类 西安裕日软件开发公司 西城区品质软件开发设计 我的世界零基础开服务器 数据库同步erp 全国网络安全设计竞赛 网络安全设备产品 小程序云开修改数据库 百度网盘的数据库技术过程 武隆区网络软件开发服务电话多少 开封大学计算机网络技术宿舍 上海网络技术咨询 简单好用的数据库 湖南筑库网络技术有限公司 九台区通用网络技术口碑推荐 网络技术服务面试常见问题 增城物联网软件开发排名 全景网络安全防御系统 下载 数据库读取密码错误 软件开发的财务分析怎么写 长沙市网络安全评选 复制数据库文件显示已打开 计算机网络技术的优势劣势 网络技术支持与网络运维 数据库操作log写入失败 数据库检索工具作用 怀旧服什么服务器能进 学习数据库技术的关键是什么 不小心删除数据库如何恢复
0