1、关于网络请求
如果使用的非常频繁则会对用户手机的电量和流量造成比较大的损耗,正所谓应用的开发应把用户体验放在第一位,所以在网络请求方面,应尽量遵循这两个原则:
1、减少移动网络被激活的时间与次数(保证应用功能正常使用的前提下)
2、对一些与用户交互的比较大的数据(图片、文件等),可以对这些数据进行压缩
3、做相应的数据缓存,避免重复请求数据
2、防止内存抖动
所谓内存抖动就是在短时间内创建出大量的对象,从而造成内存紧张,进而触发GC回收,因为执行GC的回收的时候,所有的线程都会暂停,包括主线程,只有等待GC回收完成后其它操作才能继续进行,通常情况下GC回收的效率是非常高效的,但是如果内存上发生大量内存抖动,那么将会导致GC的回收效率降低。所以内存抖动很可能会造成界面卡顿。
防止内存抖动:
1、可以使用对象池来管理对象,减少对象创建的次数,在使用完成之后再手动释放对象池中的对象
2、不要在for、while等循环体中执行对象的创建
3、避免在onDraw()方法中执行对象的创建
4、采用预分配策略来减少一次性创建大量的数据
3、针对自定义View,我们在
我们知道调用View.invalidate()会触发View的重绘,有两个原则需要遵守:
1、仅仅在View的内容发生改变的时候才去触发invalidate方法
2、尽量使用ClipRect等方法来提高绘制的性能
减少绘制时不必要的绘制元素,对于那些不可见的元素,我们需要尽量避免重绘
不要在onDraw()方法中执行内存分配的操作,如:不要在onDraw()方法中执行Paint mPaint = new Paint();等操作
对于不在屏幕上的元素,可以使用Canvas.quickReject把他们给剔除,避免浪费CPU资源。另外尽量使用GPU来进行UI的渲染,这样能够极大的提高程序的整体表现性能
4、慎用AsyncTask
使用网络请求框架(Volley、OkHttp)代替关于AsyncTask在异步网络请求方面用的非常多,因为它使用起来比较轻量,但是关于AsyncTask也存在内存泄漏和结果丢失等问题,下面一起来看看:
1、内存泄漏
如果在Activity中使用AsyncTask以匿名内部类的方式请求网络,由于AsyncTask的生命周期可以比Activity的长(因为请求网络数据是比较耗时的),AsyncTask内部类持有Activity的引用的话,如果还在请求网络时就关闭了Activity,那么将导致Activity对象将无法回收,进而产生内存泄漏
2、结果丢失
假如Activity的launchMode是默认或者是标准的,那么当AsyncTask在请求网络数据时把屏幕旋转了,那么将会重新创建一个新的Activity,又因为还在运行的AsyncTask持有之前Activity的引用,那么将导致onPostExecute()方法不起任何作用,请求获得的数据不能加载到新的Activity上,而且也将导致内存泄漏
3、串行和并行多版本不一致
AsyncTask在1.6之前为串行,在1.6-2.3为并行,在3.0之后又改为串行,在3.0之后虽然可以通过代码来改变默认的串行为并行,但是又是一个繁琐的操作
网友评论