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 ...
随机推荐
- 【比赛游记】NOIP2017游记
身为FJ的选手,在师大附中AHSOFNU考试,环境很不错,考得也还可以吧...[考的并不好] 不过比赛前都在划水233333 另:看到这篇博客的OIer们一定要评论啊! Day1的中午,因为穿了短袖去 ...
- 底板芯片组与内存映射(Motherboard Chipsets and the Memory Map) 【转】
转自:http://blog.chinaunix.net/uid-25909619-id-4194650.html 底板芯片组与内存映射 我打算写一些关于计算机内部构造(computer intern ...
- usb_control_msg函数用法和说明
usb_control_msg是没有用到urb的在USB中简单进行发送和接收的一种机制,用于少量的数据通信.原型为: 程序代码 linux+v2.6.35/drivers/usb/core/mess ...
- Linux dd命令中dsync与fdatasync的区别【转】
在Linux系统中经常会使用dd命令来测试硬盘的写入速度,命令会涉及到两个参数:dsync与fdatasync,本文介绍一下其区别. dd if=/dev/zero of=/tmp/1Gbytes b ...
- Python 3之str类型、string模块学习笔记
Windows 10家庭中文版,Python 3.6.4, Python 3.7官文: Text Sequence Type — str string — Common string operatio ...
- SOA并不能解决高并发事务
传统SOA架构其实无法面对高并发事务. 这种方式不适合热点资源,也就是高并发场合. 虽然乐观锁短,但是容易产生脏数据. SOA是以服务这个方式对外提供功能,我们很显然喜欢在Service中加上JTA等 ...
- 《高性能MySQL》学习笔记
第1章 MySQL架构与历史 1.2 并发控制 MySQL在两个层面实现并发控制:服务器层与存储引擎层. 读锁和写锁: 在处理并发读或写时,可以通过实现一个由两种锁组成的系统来解决问题. 这两种锁通常 ...
- zoj 3827(2014牡丹江现场赛 I题 )
套公式 Sample Input 33 bit25 25 50 //百分数7 nat1 2 4 8 16 32 3710 dit10 10 10 10 10 10 10 10 10 10Sample ...
- Android Studio 3.0正式版填坑之路
原文:https://www.jianshu.com/p/9b25087a5d7d Android Studio 3.0启动图 序言 总看别人的文章,今天尝试着自己来写一篇.在逛论坛时候,无意间发 ...
- 【LOJ】#2106. 「JLOI2015」有意义的字符串
题解 点一个技能点叫特征方程 就是 \(a_{n + 2} = c_1 a_{n + 1} + c_2 a_{n}\) \(x^2 = c_1 x + c_2\) 解出两根来是\(x_1,x_2\) ...