首页 文章 精选 留言 我的

精选列表

搜索[android],共10000篇文章
优秀的个人博客,低调大师

Android系统匿名共享内存(Anonymous Shared Memory)C++调用接口分析(4)

2.MemoryBase 文章开始时说过,MemoryBase接口是建立在MemoryHeapBase接口的基础上的,它们都可以作为一个Binder对象来在进程间进行数据共享,它们的关系如下所示: MemoryBase类包含了一个成员变量mHeap,它的类型的IMemoryHeap,MemoryBase类所代表的匿名共享内存就是通过这个成员变量来实现的。 与MemoryHeapBase的分析过程一样,我们先来看MemoryBase类在Server端的实现,然后再来看它在Client端的实现。 MemoryBase在Server端实现的类图如下所示: MemoryBase类在Server端的实现与MemoryHeapBase类在Server端的实现是类似的,这里只要把IMemory类换成IMemoryHeap类、把BnMemory类换成BnMemoryHeap类以及MemoryBase类换成MemoryHeapBase类就变成是MemoryHeapBase类在Server端的实现了,因此,我们这里只简单分析IMemory类和MemoryBase类的实现。 IMemory类定义了MemoryBase类所需要实现的接口,这个类定义在frameworks/base/include/binder/IMemory.h文件中: classIMemory:publicIInterface { public: ...... virtualsp<IMemoryHeap>getMemory(ssize_t*offset=0,size_t*size=0)const=0; ...... void*pointer()const; size_tsize()const; ssize_toffset()const; }; 成员函数getMemory用来获取内部的MemoryHeapBase对象的IMemoryHeap接口;成员函数pointer()用来获取内部所维护的匿名共享内存的基地址;成员函数size()用来获取内部所维护的匿名共享内存的大小;成员函数offset()用来获取内部所维护的这部分匿名共享内存在整个匿名共享内存中的偏移量。 IMemory类本身实现了pointer、size和offset三个成员函数,因此,它的子类,即MemoryBase类,只需要实现getMemory成员函数就可以了。IMemory类的实现定义在frameworks/base/libs/binder/IMemory.cpp文件中: void*IMemory::pointer()const{ ssize_toffset; sp<IMemoryHeap>heap=getMemory(&offset); void*constbase=heap!=0?heap->base():MAP_FAILED; if(base==MAP_FAILED) return0; returnstatic_cast<char*>(base)+offset; } size_tIMemory::size()const{ size_tsize; getMemory(NULL,&size); returnsize; } ssize_tIMemory::offset()const{ ssize_toffset; getMemory(&offset); returnoffset; } MemoryBase类声明在frameworks/base/include/binder/MemoryBase.h文件中: classMemoryBase:publicBnMemory { public: MemoryBase(constsp<IMemoryHeap>&heap,ssize_toffset,size_tsize); ...... virtualsp<IMemoryHeap>getMemory(ssize_t*offset,size_t*size)const; ...... private: size_tmSize; ssize_tmOffset; sp<IMemoryHeap>mHeap; }; MemoryBase类实现在frameworks/base/libs/binder/MemoryBase.cpp文件中: MemoryBase::MemoryBase(constsp<IMemoryHeap>&heap, ssize_toffset,size_tsize) :mSize(size),mOffset(offset),mHeap(heap) { } sp<IMemoryHeap>MemoryBase::getMemory(ssize_t*offset,size_t*size)const { if(offset)*offset=mOffset; if(size)*size=mSize; returnmHeap; } 在它的构造函数中,接受三个参数,参数heap指向的是一个MemoryHeapBase对象,真正的匿名共享内存就是由它来维护的,参数offset表示这个MemoryBase对象所要维护的这部分匿名共享内存在整个匿名共享内存块中的起始位置,参数size表示这个MemoryBase对象所要维护的这部分匿名共享内存的大小。 成员函数getMemory的实现很简单,只是简单地返回内部的MemoryHeapBase对象的IMemoryHeap接口,如果传进来的参数offset和size不为NULL,还会把其内部维护的这部分匿名共享内存在整个匿名共享内存块中的偏移位置以及这部分匿名共享内存的大小返回给调用者。 这里我们可以看出,MemoryBase在Server端的实现只是简单地封装了MemoryHeapBase的实现。1 本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/966918,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android应用开发提高系列(1)——《Practical Java 中文版》读书笔记(上)

书籍 《Practical Java 中文版》 03版 侯捷、刘永丹译 本书和《Effective Java》,对前述重要而基础的技术细微处有着详尽、深刻、实用的介绍、剖析和范例,又以独立条款之姿展现,在内容的扎实度、可读性及易读性上的表现均十分良好。 本书围绕Java编程中遇到的实际问题展开。可以说书中所列专题正是那些令许多Java程序员困惑不已的FAQ。作者擅长采用恰如其分的示例来阐释问题,以平时的语言娓娓道出中肯的建议。这些建议往往一语中的,能直接融入编程工作中,可见它们确实是出自作者从实践中获得的真知灼见。 正文 注意:条目和用语可能与书籍有所出入,但尽量保持原样加一些自己的理解。 一、一般技术 1. Java唯一一种参数传递机制:by value(传值)。 备注:当参数为对象时,以传值方式传递对象的引用。(个人理解:传递指针的拷贝) 2. 对不变的data和object references使用final 备注:当声明一个对象为final时,不能改变其指向,但能改变其对象的值。 3. 缺省情况下所有非私有(non-private)、非静态(non-static)函数都可被覆写。 3.1 如果函数不想被子类覆写,将函数声明为final即可。 3.2 如果类不想被子类覆写,将类声明为final即可,从而禁止覆写该类所有函数。还能提高性能。 4. 在数组和Vectors之间慎重选择。 数组 Vector 存储数据类型 基本类型、引用类型 引用类型 元素默认值 Yes No 自动改变大小 固定不变 动态增长 速度快 Yes No 备注: Vector内部实际是以数组实现的。 5. 多态优于instanceof,必要时才使用instanceof。 备注:例如从父类转型为派生类时,需要使用instanceof。 6. 一旦不需要的对象引用,就将它设为null。 备注:如果局部变量的引用使用完离函数结束前还需要执行较大代码,可在使用完后设置为null,以便或许能使其在垃圾回收器下次运行时被回收。 二、对象与相等性 1. 区别 == 和 equals() 备注:请使用 == 测试两个基本类型是否完全相同,或测试两个对象引用是否指向同一个对象;使用equals()比较两个对象的内容是否相等。 2. 不要依赖equals()缺省实现 备注:所有Java对象都隐含继承了java.lang.Object,默认的equals()只是检查对象引用是否指向同一个对象。 3. 实现equals()建议: 3.1 请检查是否等于this 备注:测试是否指向同一个对象 3.2 优先考虑使用getClass() 备注:getClass()返回某个对象的运行期类(runtime class)。确保只有相同class所产生的对象才有机会被视为相等。范例: public classBase{ @Override publicbooleanequals(Objectobj){ if(obj!= null&&getClass()==obj.getClass()){ // 继续比较相等性或直接返回true } return false; } } 3.3 调用super.equals()唤起父类的相关行为 备注:当你为一个派生类撰写equals()时,你必须检查除java.lang.Object之外所有父类,看看它们是否都实现了equals()。如果有,那么一定要调用super.equals()。 3.4 在equals()函数中谨慎使用instanceof 备注:如果允许派生类和父类进行比较,可能要采用instanceof(getClass()会恒返回false)。注意instanceof类似于is-a语义,需要注意位置,即(子类 instanceof 父类 -> 返回true;反之为false)。 三、 异常处理 1. 认识异常流程机制 备注:try区段 -> [catch捕获区段][可选] -> finally终结区段。 2. 处理异常 如果异常产生却未被捕获,发生异常的线程将中断。处理异常: a). 捕获并处理它,防止进一步传播。 b). 捕获并抛出一个新的异常给调用端。 备注:应确保新抛出的异常包含原异常相关信息,以保证不丢失重要信息。 c). 不捕获,任其传播给调用端。 输出错误信息: a). 日志文件记录曾经发生过的异常 b). 输出异常 输出到标准错误串流:如e.printStackTrace()。 3. 防止出现异常覆盖 备注:如果在catch或finally区段又抛出了未捕获的异常,新的异常将覆盖try抛出的异常,只有一个异常可被传播到调用段。 4. throws子句 备注:提供throws子句的用意在于,提醒函数调用者,告知可能发生的异常。编译器会强迫调用端捕捉这些被列出的异常,所以不要再开发周期的最后才添加。 如果覆写对象(某个父类函数)没有抛出任何异常,那么覆写函数因为增加了代码而引发异常,那么你必须在新函数中捕捉异常并处理。 5. 使用finally避免资源泄漏 备注:finally区段代码无论是否发生异常都将执行,尤其适合维护对象内部状态和清理non-memory资源。 6. 使用建议: a). 不要从try区段执行return、break或continue语句离开try区段 备注:如果try区段和finally区段都return 数据,将返回finally区段return的数据。 b). 将try/catch区段置于循环之外 备注:异常对代码性能产生负面影响 c). 不要将异常用于流程控制 d). 在构造函数中抛出异常 e). 抛出异常之前将对象恢复为有效状态 备注:考虑下次执行这段代码时会发生什么事情,代码是否还能正常运行。 结束 预计本系列前几篇文章为《Practical Java》和《Effective Java》的读书笔记,后续内容还在规划当中,也欢迎大家把感兴趣的内容反馈给我作为潜在的系列文章。 本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/844921,如需转载请自行联系原作者

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

用户登录
用户注册