Android 开发优化小结

目录

Android基本组件

UI与布局

进程、线程与消息通信


Android基本组件

  1. 当前的Activity的onPause方法执行完成之后才会执行下一个Activity的onCreate方法,所以在onPause方法中不适合做耗时较长的工作,这会影响页面之间的跳转效率。
  2. 使用Toast时,建议定义一个全局的Toast对象,这样可以避免连续显示Toast时不能取消上一次Toast消息的情况。
  3. 使用Adapter的时候,如果你使用了ViewHolder做缓存,在getView()的方法中无论这项convertView的每个子控件是否需要设置属性(比如某个TextView设置的文本可能为null,某个按键的背景为透明,某控件的颜色为透明等),都需要为其显式设置属性(TextView的文本为空也需要设置setText(""),背景透明也需要设置),否则在滑动过程中,因为adpter item复用的原因,会出现内容的显示错误。
  4. Activity或者Fragment中动态注册BroadcastReceiver时,registerReceiver()和unregisterReceiver()要成对出现。因为如果registerReceiver()和unregisterReceiver()不成对出现,则可能导致已经注册的receiver没有在合适的时机注销,导致内存泄露,占用内存空间,加重SystemService负担。

UI与布局

  1. 布局不得不适用ViewGroup多重嵌套时,不要使用LinearLayout嵌套,改用RelativeLayout,可以有效降低嵌套数。因为Android应用页面的任何一个View都是需要经过measure,layout,draw三个步骤才能被正确渲染的,从xml layout的顶部节点开始进行measure,每个节点都需要向自己的父节点提供自己的尺寸来决定展示的位置,在此过程中可能还会需要重新measure(由此可能导致measure的事件消耗为原来的2-3倍)。节点所处位置越深,嵌套带来的measure越多,计算就会越耗时。这就是为什么扁平的View结构会性能更好的原因。页面上的View越多,渲染的事件越久,所以尽量保持View的树形结构扁平化,移除所有不需要渲染的View。理想情况下,这个时间要控制在16ms以内,以保证滑动屏幕时UI的流畅。
  2. 在Activity中显示对话框或者弹出浮层,尽量使用DialogFragment,而非Dialog/AlertDialog,这样便于随Activity生命周期管理对话框/弹出浮层的生命周期。
  3. 源文件统一采用UTF-8的形式进行编码。
  4. 禁止在非ui线程进行view相关操作。
  5. 禁止在设计布局时多次设置子view和父view为同样的背景造成页面过度绘制,推荐将不需要显示的布局进行及时隐藏。
  6. 尽量不要使用AnimationDrawable,它在初始化的时候就将所有图片加载到内存中,特别占内存,并且还不能释放,释放之后下次再次加载时会报错。因为一次性加载所有帧图片所导致的内存消耗可能会使低端机发生OOM异常。帧动画所使用的图片要注意降低内存消耗,当图片比较大时,容易出现OOM。
  7. 不能使用ScrollView包裹ListView/GridView/ExpandableListView,因为这样会把ListView的所有item都加载到内存中,要消耗巨大的内存和CPU去绘制界面,非常损耗性能。建议使用NestedScrollView。

进程、线程与消息通信

  1. 不要通过Intent在Android基础组件之间传递大数据(binder transaction缓存为1MB),可能导致OOM。
  2. 新建线程时,必须通过线程池提供(AsyncTask或者ThreadPoolExecutor或者其他形式自定义的线程池),不要在应用中自行显式创建线程。说明:使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源不足的问题。如果不使用线程池,有可能造成系统创建大量的同类线程而导致消耗完内存或者“过度切换”的问题。另外创建匿名线程不便于后续的资源使用分析,对性能分析等会造成困扰。

 仅作为开发过程中遇到的优化问题记录,后面也会持续更新。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>