Android framework回想(2) sp 和 wp sp对象
用MediaPlayer说明sp的实现。sp是一个模板类,T是RefBase的子类。仅仅要继承于RefBase的类都能够使用sp。
binder类也继承RefBase类,binder的实现离不开RefBase。
用例如以下代码说说我遇到的疑惑。
201 static sp<MediaPlayer> getMediaPlayer(JNIEnv* env, jobject thiz)
202 {
203 Mutex::Autolock l(sLock);
204 MediaPlayer* const p = (MediaPlayer*)env->GetIntField(thiz, fields.context);
205 return sp<MediaPlayer>(p); //(1)c++两种初始化对象方法。
206 }
413 static void
414 android_media_MediaPlayer_start(JNIEnv *env, jobject thiz)
415 {
416 ALOGV("start");
417 sp<MediaPlayer> mp = getMediaPlayer(env, thiz); //(2)重载的操作符 =
418 if (mp == NULL ) {
419 jniThrowException(env, "java/lang/IllegalStateException", NULL);
420 return;
421 }
422 process_media_player_call( env, thiz, mp->start(), NULL, NULL ); //(3)
423 }
sp是什么?
mp是sp<MediaPlayer>的对象,怎么的能调用到MediaPlayer的start函数呢?
sp就是个模板类。:
那mp怎么调用start()的呢?
查看sp源代码类。就会发现sp类中重写了->, 使->指向成员变量m_ptr(T* 模板參数的对象。如MediaPlayer),
mp->的返回值是m_ptr,即返回的是MediaPlayer的对象,当然能调用start方法了。
事实上sp中还重写了 & 和 = 操作符 。
mp的生命周期仅仅在android_media_MediaPlayer_start方法里面有效。方法运行完后就该释放。
这就有问题了,假设mp里面全部内存都释放了,别的地方还有引用。就会出现空指针。假设不释放,别的地方又不引用了,就内存泄露了。
怎么解决问题呢?
Android 引入了引用计数。weakref_impl类里面保存引用数目。记录了T被引用的次数。
引用次数为0时就释放。可是如过。sp<T1> 和sp<T2>之间相互引用,就相互依赖。没法释放了。这时又引入了强引用和弱引用。
sp wp RefBase T 类之间的关系例如以下图
用sp<MediaPlayer>分析,计数过程,
return sp<MediaPlayer>(p); 构造时。运行m_ptr->incStrong(this)方法,使MediaPlayer对象的强弱引用都加一。
getMediaPlayer运行完后。会调用匿名对象的析构函数~sp,运行m_ptr->decStrong(this),使MediaPlayer对象的强弱应用都减一。
在android_media_MediaPlayer_start函数里面,对mp进行赋值,使用的是重载的operator=,重载的过程也运行m_ptr->incStrong(this),也使MediaPlayer对象的强弱引用添加1。android_media_MediaPlayer_start函数运行完后,释放mp。会调用mp的析构函数,运行m_ptr->decStrong(this),也使MediaPlayer对象的强弱引用都加一.例如以下图:
Android framework回想(2) sp 和 wp sp对象的更多相关文章
- Android中的sp和wp指针
经常会在android的framework代码中发现sp<xxx>和wp<xxx>这样的指针,平时看的时候都把他当成一个普通的指针封装过掉了,这几天终于忍不住了,想深入了解一下 ...
- Android 内核初识(7)RefBase、LightRefBase、sp和wp
简介 RefBase是Android中所有对象的始祖,类似MFC中的CObject及Java中的Object对象.在Android中,RefBase结合sp和wp,实现了一套通过引用计数的方法来控制对 ...
- android RefBase、sp、wp
首先RefBase在android的c++部分是作为一个所有类的基类,其作用跟Java中的Object类似 这个类中存在一个私有成员: weakref_impl* const mRefs;(weakr ...
- Android中px, ppi, dpi, dp, dip, sp概念解析
Android中px, ppi, dpi, dp, dip, sp概念解析
- Android Framework中的线程Thread及它的threadLoop方法
当初跟踪Camera的代码中的时候一直追到了HAL层,而在Framework中的代码看见了许很多多的Thread.它们普遍的特点就是有一个threadLoop方法.依照字面的意思应该是这个线程能够循环 ...
- 解析android framework下利用app_process来调用java写的命令及示例
解析android framework下利用app_process来调用java写的命令及示例 在android SDK的framework/base/cmds目录下了,有不少目录,这些目的最终都是b ...
- <Android Framework 之路>BootAnimation(2)
前言 上一篇主要讲解了BootAnimation是从何而来,如何启动,从开机,到SurfaceFlinger服务起来,然后到执行开机动画,如果要深入的看里面的代码,是需要花一定的时间的,我们旨在了解大 ...
- 怎样从C++代码直接訪问android framework层的WifiService
说究竟,Java层的service就是就C++层的binder的封装.所以从原理上来讲通过C++代码直接訪问android framework层的service是全然可能的,这篇文章以訪问WifiSe ...
- <Android Framework 之路>Android5.1 Camera Framework(一)
Android5.0 Camera Framework 简介 CameraService启动 CameraService是在MediaServer启动过程中进行的 main_mediaserver.c ...
随机推荐
- imperva—waf 敏感字段显现
imperva WAF中看到的日志内容信息有些都是敏感的 比如登录登出的信息 如何调整敏感信息的现实方式,并可以自定义敏感字段? 这里添加字段就可以了 这样就将******转变为明文了
- CyberArticle(eLib电子图书馆)网文快捕
CyberArticle (网文快捕)是一款知识管理软件,主要致力于网页的保存和后期管理.CyberArticle (网文快捕)主要功能,就是收集和整理网页.利用CyberArticle (网文快捕) ...
- 012_iTerm2 快捷键大全
标签 新建标签:command + t 关闭标签:command + w 切换标签:command + 数字 command + 左右方向键 切换全屏:command + enter 查找:comma ...
- Eclipse 中 不能创建 Dynamic web project
工作要涉及web开发,之前下载的java SE (我的是luna) 版本默认无法新建web项目,也就是找不到Dynamic Web ,在网上看了些解决办法,最终却是解决了问题,说到底就是安装一些用于E ...
- MySQL 数据库性能优化之SQL优化【转】
优化目标 减少 IO 次数IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先考虑, ...
- Excel学习笔记:sumif、sumifs、countifs函数使用方法
本篇纯粹记录一下sumif.sumifs.countifs函数的使用方法. 一.sumif函数 按条件求和 使用格式:=sumif(条件区域,求和条件,实际求和区域) =SUMIF($B$7:$B$1 ...
- SqlServerDBCC SHRINKFILE不起作用
检查索引碎片的结果: CREATE DATABASE test_shrink USE test_shrink CREATE TABLE show_extent(a INT,b NVARCHAR(390 ...
- Java编程的逻辑 (19) - 接口的本质
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...
- .NetCore 下使用多个DbContext
一个项目中使用多个DbContext 或者种数据库的多个DbContext 业务需要 单个DbContext使用不需要给出说明 1.dotnet ef migrations add migration ...
- Codeforces Round #254 (Div. 1) D - DZY Loves Strings
D - DZY Loves Strings 思路:感觉这种把询问按大小分成两类解决的问题都很不好想.. https://codeforces.com/blog/entry/12959 题解说得很清楚啦 ...