如何对移动应用做性能优化_第1页
如何对移动应用做性能优化_第2页
如何对移动应用做性能优化_第3页
如何对移动应用做性能优化_第4页
如何对移动应用做性能优化_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

如何对移动应用做性能优化?

任性的代价2014年“双十一”转型后的第一个机房:1个变2个+N多NB服务器万事俱备、只待下单结果....别仗着硬件NB任性!!!我觉得问题不大,可以忍~上线前上线后哪些方面?需求:哪些指标需要优化定位:性能问题在哪里解决:优化方法4常见性能指标启动速度列表页滚动平滑点击事件响应图片加载快省电内存占用....不同产品,不同流程,优化方法不同思路和理念比实际方法更重要–Paretoprinciple“formanyevents,roughly80%oftheeffectscomefrom20%ofthecauses.”定位性能瓶颈71、启动速度2、滑动平滑性4、内存占用3、网络响应时间启动速度优化延时初始化人的反应时间150ms~400ms看到启动完成到开始下一步操作有一个停顿在onCreate,onResume等回调方法中只进行ui初始化利用空闲时间动画间隙溅起页请求全局配置数据,缓存到本地。资源文件拷贝自定义字体网络图片图片很多自动加载更多

如何保证流畅滑动?找瓶颈!!!滑动平滑性优化-ListView9重用ConvertView10滑动平滑性优化-ListView使用ViewHolder11以上这两步是谷歌官方强烈推荐的做法,不只适用于ListView,也适用于GridView等如果没有特殊情况,所有ListView的Adapter都应该这样处理。注意:这是一个静态内部类面试时通过类似细节,分辨开发者水平和经验滑动平滑性优化-ListView跟踪Scroll事件12该函数执行时间直接影响ListView滑动的流畅性。该函数的内部实现要遵循以下原则:只做getView()必须做的操作,其它无关操作一定要放到外部。例如:自定义字体加载耗时操作一定要放到另外的WorkThread执行。例如:图片的加载,网络请求等。优化getView()如果ListView的内容特别复杂,为进一步提升流畅性,可以考虑跟踪Scroll的滑动事件,在滑动时暂停其它Thread或降低优先级滑动平滑性优化-ListView13建议使用第三方库,例如:picasso,volley等。但是,一定要了解库的实现原理。(AsyncHttpClient的例子)如何加载网络图片滑动平滑性优化-ListView14库的实现原理ImageView加载图片请求是否在内存缓存?开启Thread是否在文件系统?更新图片内存缓存从网络加载图片更新文件缓存ImageView加载图片是否否是二级缓存Md5索引一级缓存LruCache线程池滑动平滑性优化-ListView工作线程如何更新UI?Runnabletask=getTask();newHandler(Looper.getMainLooper()).post(task);能用AsyncTask代替吗?15LruCache实现原理:滑动平滑性优化-ListView滑动平滑性优化-ListView图片服务器防止恶意攻击缩放裁剪留白圆角灰度滤镜压缩锐化1234567回顾性能瓶颈171、启动速度2、滑动平滑性4、内存占用3、网络响应时间延迟初始化利用空闲时间重用ConvertViewViewHolder优化getView异步请求网络图片图片服务器问:如何提高网络请求响应速度?答:1.多线程并发请求。2.弃用xml,采用json、protobuf。3.gzip压缩问:如何解决请求过多,线程占用资源问题?答:队列+线程池(newCacheThreadPool)(Volley,AsyncHttpClient)问:如何解决集合访问冲突问题?答:

ConcurrentHashMap、ConcurrentLinkedQueue

关注

java.util.concurrent网络响应时间AsyncHttpClientContextListContextListContextListContextListRequestHandleRequestHandleAsyncHttpRequestnewCachThreadPoolRequestResponseCollection.synchronized(newWeakHashMap())Collection.synchronized(newArrayList())newFixedThreadPool回顾性能瓶颈201、启动速度2、滑动平滑性4、内存占用3、网络响应时间延迟初始化利用空闲时间重用ConvertViewViewHolder优化getView异步请求网络图片图片服务器Json+gzip并发请求善用第三方库内存问题单例模式观察者模式SoftReferenceVSWeakReference单例对象NotificationManager.getInstance(this).update(XXX);1.只要应用进程存在,单例对象就存在。2.构造参数,只会在第一次时有用,之后的都不会被用3.尽量不写带构造参数的单例4.如果要用context,首先考虑applicationcontext。观察者模式ListenerListenerListenerAddListenerRemoveListenerList<Listener>注意内存泄露:List<Listener>是单例的成员List<Listener>是static易犯错误:AddListener和RemoveListener没有配对使用,就会内存泄露解决方法:WeakReferenceSoftReferenceVSWeakReference强引用除非即将OutOfMemory,否则不会被GC回收适合Cache,例如:SoftReference<Bitmap>SoftReference弱引用执行GC时,就会被回收WeakReference看起来很美实际上......什么时候会执行GC?Activity1Activity2CityManagerWeakReference:当弱引用对象被其他人以非弱引用持有时,该对象不会被回收。否则,很快会被回收。换句话说,弱引用对象如果是最后一个持有该对象的人,该对象很快会被回收。嵌套类NestedClass静态成员类staticmemberclass非静态成员类nonstaticmemberclass匿名类anonymousclass局部类localclasspublicclassA{ classB{}}publicclassA{ staticclassC{}}voidfun(){newView.OnClickListener{};}staticvoidfun(){newView.OnClickListener{};}voidfun(){ classD{}}staticvoidfun(){ classE{}}内部类

Innerclass不持有一定持有可能持有可能持有Handler内存泄露持有外部Activity的引用静态成员类Activity的弱引用Thread内存泄露思考:用AsyncTask是不是就没问题了?回顾性能瓶颈301、启动速度2、滑动平滑性4、内存占用3、网络响应时间延迟初始化利用空闲时间重用ConvertViewViewHolder优化getView异步请求网络图片图片服务器Json+gzip并发请求善用第三方库单例+

观察者Soft/WeakReferencen嵌套类其他-自定义字体Calligraphy库其他第三方库

做过这些尝试美丽说

全部用自定义控件,例如:CustomTextView美喵TypefaceHelper,从父节点遍历统一修改

现在是这样不靠谱WAP页如何自定义字体?@font-face{font-family:'myfont';src:url(‘res/font.ttf');}url(‘file:///android_asset//font.ttf');url(‘file:////d

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论