重写View的onDraw方法生成Paint实例产生报警
2016-10-20 17:29
190 查看
来自百度知道的回答
如图所示,在onDraw方法里新建Paint对象会产生报警。
View 的 onDraw() 方法会被频繁的调用,android给出这个警告的意思是,不建议开发者在onDraw()函数体内进行对象分配.如果在其中有需要用到的对象,应该把这些对象的分配放在别处.
比如楼主这个问题,就可以在构造函数里初始化一个类的成员变量mPaint,在onDraw()函数体内只对其调用setColor(),不进行new操作.
按谷歌的解释,避免在onDraw()内分配对象,是为了减少垃圾回收器对绘图性能的影响.
我查了一下,Android所用的Dalvik虚拟机,其垃圾回收器工作时是需要 stop the world 的.意思是说,垃圾回收器工作时,会停止此虚拟机中的一切线程,等垃圾回收器工作完成,程序线程才能再次工作.
而垃圾回收最活跃的地方,必然是堆内存上,也就是new操作产生的内存占用.所以在onDraw()函数体内尽量少new对象出来,就可以尽量减少虚拟机 stop the world 的时间.
如不明白建议百度下java垃圾回收器的工作方式,大体了解下.
onDraw()调用到底有多频繁?你把你的这个view放进一个ScrollView里,然后在onDraw()里加一行log,然后滚动你的屏幕,看着海量的log输出,就会有些体会了
如图所示,在onDraw方法里新建Paint对象会产生报警。
原因:
这个警告信息是 Android Lint 给出的,不是标准java的警告.View 的 onDraw() 方法会被频繁的调用,android给出这个警告的意思是,不建议开发者在onDraw()函数体内进行对象分配.如果在其中有需要用到的对象,应该把这些对象的分配放在别处.
比如楼主这个问题,就可以在构造函数里初始化一个类的成员变量mPaint,在onDraw()函数体内只对其调用setColor(),不进行new操作.
按谷歌的解释,避免在onDraw()内分配对象,是为了减少垃圾回收器对绘图性能的影响.
我查了一下,Android所用的Dalvik虚拟机,其垃圾回收器工作时是需要 stop the world 的.意思是说,垃圾回收器工作时,会停止此虚拟机中的一切线程,等垃圾回收器工作完成,程序线程才能再次工作.
而垃圾回收最活跃的地方,必然是堆内存上,也就是new操作产生的内存占用.所以在onDraw()函数体内尽量少new对象出来,就可以尽量减少虚拟机 stop the world 的时间.
如不明白建议百度下java垃圾回收器的工作方式,大体了解下.
onDraw()调用到底有多频繁?你把你的这个view放进一个ScrollView里,然后在onDraw()里加一行log,然后滚动你的屏幕,看着海量的log输出,就会有些体会了
相关文章推荐
- Android 自定义View需要重写ondraw()等方法
- 在继承SurfaceView的类中如何重写onDraw()方法使其有效
- property生成属性的时候,同时重写setter与getter方法,那么实例变量不自动生成
- textview 的onDraw()方法被重写后,文字被覆盖掉了的解决办法
- Android 自己定义View须要重写ondraw()等方法
- 自定义view之继承View重写onDraw方法
- php产生随机数的两种方法实例代码 输出随机IP
- 安全彻底关闭实例Excel.Application后产生的进程方法
- asp.net 生成静态时的过滤viewstate的实现方法
- 一个安全彻底关闭实例Excel.Application后产生的进程方法
- EXT 笔记 构造方法,类继承,类实例方法重写
- PHP生成静态页大致的方法(实例)
- 记surfaceView和Paint的方法。
- 安全彻底关闭实例Excel.Application后产生的进程方法
- ASP.NET Forum 中禁用含有子版块的版块后产生的"未将对象引用设置到对象的实例"异常的处理方法
- 类的高级运用、异常、集合、文件读写、序列化、重写equals和hashCode方法实例
- paint()方法中Graphics实例对象是怎么来的
- iTEXT生成PDF文件使用方法 实例 示例 Servlet输出PDF文档方法
- 安全彻底关闭实例Excel.Application后产生的进程方法
- 实例详细讲解ASP生成静态HTML页面方法