码迷,mamicode.com
首页 > 移动开发 > 详细

麦子学院android开发之Android应用开发视图优化步骤

时间:2015-07-16 11:17:25      阅读:375      评论:0      收藏:0      [点我收藏+]

标签:android   android开发   

1)View优化
i.   减少不必要的View以及View的嵌套层次。
比如实现一个listview中常用的layout,可以使用RelativeLayout减少嵌套,要知道每个View的对象会耗费1~2k内存,嵌套层次过多会引起频繁的gc,造成ANR。
ii.   通过HierarchyViewer查看布局结构
利用HierarchyViewer来查看View的结构:~/tools/hierarchyviewer,能很清楚地看到RelativeLayout下面的扁平结构,这样能加快dom的渲染速度。
iii.   通过Layoutopt优化布局
通过Android sdk中tools目录下的layoutopt命令查看你的布局是否需要优化。


2) 
多线程解决复杂计算
占用CPU较多的数据操作尽可能放在一个单独的线程中进行,通过handler等方式把执行的结果交于UI线程显示。特别是针对的网络访问,数据库查询,和复杂的算法。目前Android提供了AsyncTask,Hanlder、Message和Thread的组合。对于多线程的处理,如果并发的线程很多,同时有频繁的创建和释放,可以通过concurrent类的线程池解决线程创建的效率瓶颈。另外值得注意的是,应用开发中自定义View的时候,交互部分,千万不要写成线程不断刷新界面显示,而是根据TouchListener事件主动触发界面的更新。

3)布局用Java完成比XML
一般情况下对于Android程序布局往往使用XML文件来编写,这样可以提高开发效率,但是考虑到代码的安全性以及执行效率,可以通过Java代码执行创建,虽然Android编译过的XML是二进制的,但是加载XML解析器的效率对于资源占用还是比较大的,Java处理效率比XML快得多,但是对于一个复杂界面的编写,可能需要一些套嵌考虑,如果你思维灵活的话,使用Java代码来布局你的Android应用程序是一个更好的方法。


4)
对大型图片进行缩放
图片读取是OOM(Out of Memory)的常客,当在Android手机上直接读取4M的图片时,死神一般都会降临,所以导致往往自己手机拍摄的照片都不能直接读取。对大型图片进行缩放处理图片时我们经常会用到BitmapFactory类,android系统中读取位图Bitmap时分给虚拟机中图片的堆栈大小只有8M。用BitmapFactory解码一张图片时,有时也会遇到该错误。这往往是由于图片过大造成的。这时我们需要分配更少的内存空间来存储。BitmapFactory.Options.inSampleSize设置恰当的inSampleSize可以使BitmapFactory分配更少的空间以消除该错误。Android提供了一种动态计算的,如下:

读取图片之前先查看其大小:
  
BitmapFactory.Options opts = new  BitmapFactory.Options();
  
opts.inJustDecodeBounds = true;
  
Bitmap bitmap =  BitmapFactory.decodeFile(imageFile, opts);
  

使用得到的图片原始宽高计算适合自己的smaplesize
  
BitmapFactory.Options opts  = new BitmapFactory.Options();
  
opts.inSampleSize = 4 ;// 4就代表容量变为以前容量的1/4
  
Bitmap bitmap =  BitmapFactory.decodeFile(imageFile, opts);
  

对于过时的Bitmap对象一定要及时recycle,并且把此对象赋值为null。
  
bitmap.recycle();
  
bitmap = null;
  


5)
合理使用ViewStub
ViewStub是一个隐藏的,不占用内存空间的视图对象,它可以在运行时延迟加载布局资源文件。当ViewStub可见,或者调用 inflate()函数时,才会加载这个布局资源文件。该ViewStub在加载视图时在父容器中替换它本身。因此,ViewStub会一直存在于视图中,直到调用setVisibility(int) 或者inflate()为止。ViewStub的布局参数会随着加载的视图数一同被添加到ViewStub父容器。同样,你也可以通过使用inflatedId属性来定义或重命名要加载的视图对象的Id值。所以我们可以使用ViewStub延迟加载某些比较复杂的layout,动态加载 View,采用ViewStub避免一些不经常的视图长期握住引用。


6)
针对ListView的性能优化
i.   复用convertView。
ii.   在getItemView中,判断convertView是否为空,如果不为空,可复用。如果couvertview中的view需要添加listerner,代码一定要在if(convertView==null){}之外。
iii.   异步加载图片,item中如果包含有web image,那么最好异步加载。
iv.   快速滑动时不显示图片
当快速滑动列表时(SCROLL_STATE_FLING),item中的图片或获取需要消耗资源的view,可以不显示出来;而处于其他两种状态(SCROLL_STATE_IDLE 和SCROLL_STATE_TOUCH_SCROLL),则将那些view显示出来。
v.   item尽可能的减少使用的控件和布局的层次;背景色与cacheColorHint设置相同颜色;ListView中item的布局至关重要,必须尽可能的减少使用的控件,布局。RelativeLayout是绝对的利器,通过它可以减少布局的层次。同时要尽可能的复用控件,这样可以减少ListView的内存使用,减少滑动时gc次数。ListView的背景色与cacheColorHint设置相同颜色,可以提高滑动时的渲染性能。
vi.   getView优化
ListView中getView是性能是关键,这里要尽可能的优化。getView方法中要重用view;getView方法中不能做复杂的逻辑计算,特别是数据库和网络访问操作,否则会严重影响滑动时的性能。

7)其他
i.   分辨率适配
-ldpi,-mdpi,-hdpi配置不同精度资源,系统会根据设备自适应,包括drawable, layout,style等不同资源。
ii.   尽量使用dp(density independent pixel)开发,不用px(pixel)。
iii.   多用wrap_content, fill_parent
iv.   抛弃AbsoluteLayout
v.   使用9patch(通过~/tools/draw9patch.bat启动应用程序),png格式
vi.   采用<merge>优化布局层数;采用<include >来共享布局。
vii.   将Acitivity中的Window的背景图设置为空。getWindow().setBackgroundDrawable(null);android的默认背景是不是为空。
viii.   View中设置缓存属性.setDrawingCache为true。



更多Android开发技术请关注麦子学院(www.maiziedu.com)

麦子学院android开发之Android应用开发视图优化步骤

标签:android   android开发   

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
麦子学院
加入时间:2015-07-08
  关注此人  发短消息
文章分类
麦子学院”关注的人------(0
麦子学院”的粉丝们------(0
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!