zgz345

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

1.http用gzip压缩,设置连接超时时间和响应超时时间

http请求按照业务需求,分为是否可以缓存和不可缓存,那么在无网络的环境中,仍然通过缓存的httpresponse浏览部分数据,实现离线阅读。

2.listview 性能优化

1).复用convertView

在getItemView中,判断convertView是否为空,如果不为空,可复用。如果couvertview中的view需要添加listerner,代码一定要在if(convertView==null){}之外。

2).异步加载图片

item中如果包含有webimage,那么最好异步加载

3).快速滑动时不显示图片

当快速滑动列表时(SCROLL_STATE_FLING),item中的图片或获取需要消耗资源的view,可以不显示出来;而处于其他两种状态(SCROLL_STATE_IDLE 和SCROLL_STATE_TOUCH_SCROLL),则将那些view显示出来

3.使用线程池,分为核心线程池和普通线程池,下载图片等耗时任务放置在普通线程池,避免耗时任务阻塞线程池后,导致所有异步任务都必须等待

4.异步任务,分为核心任务和普通任务,只有核心任务中出现的系统级错误才会报错,异步任务的ui操作需要判断原activity是否处于激活状态

5.尽量避免static成员变量引用资源耗费过多的实例,比如Context

6.使用WeakReference代替强引用,弱引用可以让您保持对对象的引用,同时允许GC在必要时释放对象,回收内存。对于那些创建便宜但耗费大量内存的对象,即希望保持该对象,又要在应用程序需要时使用,同时希望GC必要时回收时,可以考虑使用弱引用。

7.超级大胖子Bitmap

及时的销毁(Activity的onDestroy时,将bitmap回收)

设置一定的采样率

巧妙的运用软引用

drawable对应resid的资源,bitmap对应其他资源

8.保证Cursor 占用的内存被及时的释放掉,而不是等待GC来处理。并且 Android明显是倾向于编 程者手动的将Cursor close掉

9.线程也是造成内存泄露的一个重要的源头。线程产生内存泄露的主要原因在于线程 生命周期的不可控

10.如果ImageView的图片是来自网络,进行异步加载

11.应用开发中自定义View的时候,交互部分,千万不要写成线程不断刷新界面显示,而是根据TouchListener事件主动触发界面的更新
 
 
 
----------------------------------------------------------------------------------------------------------------------------
 
 一、慎用Logcat输出
  如果你的应用总是在后台不断的输出Log.i或Log.d的内容,除了增加系统开销外,对你应用的整体效率受影响,尤其是持续输出很多内容。由于Log需要底层的JNI调用,对Java虚拟机的开销来说还是不小的。
  二、ProGuard扰码器
  对于Android应用加密,扰码器可能除了修改类和变量的名称外,增加算法复杂难度,可能出现本身1+1=2的问题变为了2*10-10-8这样的情况,当然Android是举个例子来说明扰码器的工作原理,这对于程序的运行效率和部分逻辑可能会改变,所以这点要权衡配置扰码器是否仅修改变量名称。
  三、基础知识
  1. 访问变量比访问一个类的字段要快/
  2. 同时判断数组为空一般不用getCount()==0这样的方法,直接通过isEmpty()这样的方法来处理
  3. 很多情况下慎用全局的静态类。
  4. Android应用执行起来很多的CPU占用都是出在JVM资源是放上,所以如果尽可能的减少内存的释放,或增加手机的RAM对程序的执行效率会很有帮助。
  5. 尽量少的注册系统广播通知接收,同时适当的可以通过重写onPause或onResume来控制Activity显示时才获取部分系统广播。
 
 
 
 
--------------------------------------------------------------------------------------------

1.     采用硬件加速,在androidmanifest.xml中application添加  android:hardwareAccelerated="true"。不过这个需要在android 3.0才可以使用。

2.     View中设置缓存属性.setDrawingCache为true.

3.      优化你的布局。通过Android sdk中tools目录下的layoutopt 命令查看你的布局是否需要优化。

4.      动态加载View. 采用ViewStub 避免一些不经常的视图长期握住引用.

5.      将Acitivity 中的Window 的背景图设置为空。getWindow().setBackgroundDrawable(null);android的默认背景是不是为空。

6.      采用<merge> 优化布局层数。 采用<include >来共享布局。

7.      查看Heap 的大小

8.      利用TraceView查看跟踪函数调用。有的放矢的优化。

9.      cursor 的使用。不过要注意管理好cursor,不要每次打开关闭cursor.因为打开关闭Cursor非常耗时。 Cursor.require用于刷新cursor.

10.      采用环形Buffer(可以采用链表数据结构实现)。可以设置一个链表长度的上限,根据手势的变化来不断地更新环形Buffer的内容。

11.      采用SurfaceView在子线程刷新UI, 避免手势的处理和绘制在同一UI线程(普通View都这样做)。

12.      采用JNI,将耗时间的处理放到c/c++层来处理。

13.      有些能用文件操作的,尽量采用文件操作,文件操作的速度比数据库的操作要快10倍左右。

14.      懒加载和缓存机制。访问网络的耗时操作启动一个新线程来做,而不要再UI线程来做。

posted on 2013-08-02 10:54  zonyZhang  阅读(7556)  评论(0编辑  收藏  举报