android性能优化的一些东西
说到android性能优化,总觉得是一个很模糊的东西,因为app的性能始终适合手机本身的性能挂钩的,也许一些消耗内容的操作,在一些移动设备可以运行,但是在另外一些上面就会出现内存溢出的问题,但是不管怎么说,但问题出现的时候,我们应该有解决的办法,最起码有解决办法的思路,下面就是聊聊android性能一些问题。
首先是三个名称:内存泄漏,内存溢出(OOM),应用程序无响应(ANR)。
我们知道,android手机上运行app其实很多时候(只是很多时候),每个app都运行在一个进程中,这个进程是设备给应用程序分配的,其实你也可以理解为,每个应用程序运行在一个设备为我们分配的虚拟机(dalivk虚拟机)中,这样一来,其实每个程序能够给我们使用的内存是设备分配给我们的。而每个进程中可以并且只有一个线程,这个线程就是主线程(也叫UI线程)。如果我们在这个主线程中做太多的耗时操作,就会引起操作的卡顿这些问题。如果严重的话就会引起应用程序无响应(ANR)。
内存泄漏就是,我们的程序在申请内存后(比如实例化对象),在使用结束后,不能及时释放掉这些内存。一般内存泄漏单次不会有太多问题,但是太多的内存泄漏会导致太多无用的内存占有,这个时候有可能会导致内存溢出(OOM)。
内存溢出分两种情况,第一种,我们为一个对象分配的空间不够本对象使用,比如实例化了一个integer对象,但是放入一个更大的对象。第二个就是虚拟机内存被占满。
那么如何解决这些问题呢,这里只是一些思路:
1、在使用布局的时候,使用简单布局。有两种情况,第一种,劲量不要嵌套太多的无用布局,这样不会在CPU运算时做太多无用的计算,第二个,就是在使用布局的时候,劲量使用简单的viewgrounp,在这里复杂程度的排序:RelativeLayout大于LinearLayout和FrameLayout。
2、在使用布局的时候,多使用<include>、<merge>和ViewStub。一般<include>和<merge>配合使用,这样就不必过多的重复使用一段代码,这样就会不至于CPU重复运行一段布局。ViewStub是在有需求的时候在加载布局,比如一个界面中有一段布局默认是不显示的,但是当我们需要时候的时候需要显示,这个时候假如我们不使用的时候也加载这段代码就是不合适的。这个时候使用ViewStub就好。
3、使用静态变量的时候劲量使用final,或是说劲量少的使用静态变量,我们知道静态变量不会随着调用它的程序结束而消失,这会导致一定程度上的内存泄漏。
4、使用属性动画的时候在Activity结束的时候,要使用animator.cancel()来停止动画,因为有些动画是无限循环的,在调用他的程序都结束的时候,他还会一直循环,这个时候也会造成内存泄漏。
5、在自定义view或viewgrounp的时候,不要在onDraw中做太多的耗时操作,因为这样会导致view的绘制过程不流畅,导致一种卡卡的感觉。
6、不要在onDraw方法中定义局部变量,因为在view绘制的工程中,onDraw方法会多次调用,这样会多次创建局部变量,对内存造成不必要的浪费。
7、对listview等的优化,在自定义Adpter的时候,使用holder,这样可以重复调用已经实例化好的对象,而不会重复实例化对象。同时在getView中不要做耗时操作,这样会使listview等整体加载流畅。
8、劲量少的使用枚举,枚举占用的空间比整形大。
9、少的创建对象,因为创建对象就会对应的创建堆内存和栈内存,基本我们不调用不赋值,也会创建堆内存。
10、劲量多的使用内存缓存和磁盘缓存,如使用LruCache等,这样可以使一些资源重复调用。
11、适当使用软应用和弱应用。
12、使用线程的时候,使用线程池,这样可以避免大量的创建线程和销毁线程的操作。
出现ANR的时候,我们可以使用系统在/data/anr里面产生的日志traces.txt进行分析。使用命令:adb pull /data/anr/traces.txt,就可以打开查看日志了。
内存泄漏的问题,我们可以使用MAT工具进行分析。
关于性能优化,其实有数不尽的需要注意的地方。毕竟永远都没有最优只要更优。也欢迎各位补充。
不是闷骚的程序员算不上程序员。我的微信公众号“那点鼻事”,在这里周一到周五每天一篇文章,与技术无关,只哈牛逼。
android性能优化的一些东西的更多相关文章
- Linux/Android 性能优化工具 perf
/***************************************************************************** * Linux/Android 性能优化工 ...
- [Android 性能优化系列]降低你的界面布局层次结构的一部分
大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 原文地 ...
- Android 性能优化——之控件的优化
Android 性能优化——之控件的优化 前面讲了图像的优化,接下来分享一下控件的性能优化,这里主要是面向自定义View的优化. 1.首先先说一下我们在自定义View中可能会犯的3个错误: 1)Use ...
- Android性能优化系列之apk瘦身
Android性能优化系列之布局优化 Android性能优化系列之内存优化 为什么APK要瘦身.APK越大,在下载安装过程中.他们耗费的流量会越多,安装等待时间也会越长:对于产品本身,意味着下载转化率 ...
- Android性能优化系列之电量优化
电量消耗的计算与统计是一件麻烦而且矛盾的事情,记录电量消耗本身也是一个费电量的事情,随着Android开的性能要求越来越高,电量的优化,也显得格外重要,一个耗电的应用,用户肯定会毫不犹豫的进行卸载,所 ...
- Android性能优化第(一)篇---基本概念
最近打算总结几篇app性能优化方面的东西,毕竟android弄了这么久,万一到哪些转了行,岁月久了就忘记了,纯粹当个人笔记.今个是第一篇---性能优化的基本概念,毛主席说了,让理论先行,理论指导实践. ...
- 【腾讯Bugly干货分享】Android性能优化典范——第6季
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/580d91208d80e49771f0a07c 导语 这里是Android性能优 ...
- android 性能优化
本章介绍android高级开发中,对于性能方面的处理.主要包括电量,视图,内存三个性能方面的知识点. 1.视图性能 (1)Overdraw简介 Overdraw就是过度绘制,是指在一帧的时间内(16. ...
- Android性能优化典范第二季
Google前几天刚发布了Android性能优化典范第2季的课程,一共20个短视频,包括的内容大致有:电量优化,网络优化,Wear上如何做优化,使用对象池来提高效率,LRU Cache,Bitma ...
随机推荐
- spring security 跨域防伪攻击
applicationContext-security.xml中配置 <http use-expressions="true" disable-url-rewriting=& ...
- 微信上传图片接口实现 JS
//2.微信上传图片接口实现 <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></scri ...
- Python3基础 内嵌函数 简单示例
镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.-------------------------------------- ...
- webstorm常用快捷键及插件
子曰:工欲善其事,必先利其器.那么问题来了,前端开发用什么比较好? 我反正用的是webstorm,之前也花了一些时间看看别人的使用方式.下面分类介绍一下. 常用快捷键: double shift : ...
- [ Android 五种数据存储方式之四 ] —— ContentProvider存储数据
Android这个系统和其他的操作系统还不太一样,我们需要记住的是,数据在Android当中是私有的,当然这些数据包括文件数据和数据库数据以及一些其他类型的数据.那这个时候有读者就会提出问题,难道两个 ...
- jQuery DataTables and ASP.NET MVC Integration
part 1 : http://www.codeproject.com/Articles/155422/jQuery-DataTables-and-ASP-NET-MVC-Integration-Pa ...
- EF 4.1 学习资源汇总
微软发布了EF 4.1以后,结合asp.net mvc3,网站的开发可谓是非常方便.但是作为一种新技术,如何开始你的学习之路呢? 首先是关于 EF 4.1的安装和介绍,以及nuget的使用. http ...
- PayPal为什么从Java迁移到Node.js
前言 大家都知道PayPal是另一家迁移到Node.js平台的大型公司,Jeff Harrell的这篇博文 Node.js at PayPal 解释了为什么从Java迁移出来的原因: 开发效率提高一 ...
- MVC伪一个12306图片验证码
本文的来由主要是满足自己的好奇心,而不是证明什么东西,如果涉及到什么官方性的事情,麻烦通知我谢谢:本篇将要和大家分享的是一个看起来通12306图片验证码相似的效果,这篇应该是今年农历最后一篇分享文章了 ...
- 理解javascript中的Function.prototype.bind
在初学Javascript时,我们也许不需要担心函数绑定的问题,但是当我们需要在另一个函数中保持上下文对象this时,就会遇到相应的问题了,我见过很多人处理这种问题都是先将this赋值给一个变量(比如 ...