ListView 性能优化:
1.使用RecyclerView,使用ViewHolder
2.为了提高流畅度,在滑动的时候不显示大图
3.将ListView的scrollingCache和animateCache设置为false
4.降低Item的布局层次
5.避免在getView中处理太多的逻辑和运算
Main Looper 响应优化:
1.使用HandlerThread 来分担UI线程的压力
2.使用IntentService 代替Service
3.避免重复inflate,可以对inflate做缓存
4.在自定义View内处理逻辑过多的时候,可以尝试使用SurfaceView来代替View
5.在操作耗时的逻辑时使用Thread或者HandlerThread处理,对现成过多的情况下可以考虑线程池来复用线程
6.酌情使用缓存,复用,对象池。
7.优化数据结构和执行算法
8.尽可能的使用jni来实现一些逻辑和算法
9.使用Window Background ViewStub 来提升启动速度。
10.为UI提供更多更丰富的loading来过渡耗时的网络请求
11.自定义View的时候不要在onDraw中做耗时的操作同时也要避免过度的GC(尽可能的减少对new 的使用)
布局优化:
1.避免过度绘制(对于过度绘制的部分可以使用裁剪处理),可以使用Android自带的系统工具查看绘制情况
2.优化布局层次
3.避免无用的布局嵌套
4.include 重用布局
5.使用Hierarchy View进行布局层次分析
6.使用ViewStup标签来做动态加载
7.酌情使用merge标签来减少布局层次
8.减少不必要的硬件缩放,尽可能的提供更完整的分辨率资源
9.让布局和View更简单(Icon 与 Text)
网络优化:
1.如果条件允许,尽可能的使用C++ Socket来处理一些合适的服务器通信
2.当需要批量的网络请求时,尽可能的做同步处理避免创建过多的线程
3.将传输的json/xml等数据进行压缩(可提高网络传输效率提升用户体验)
4.使用增量更新解决大数据更新的问题(比如更新App,同步大数据库)
5.将更多的耗时任务分布式管理(比如说预初始化,当你有大的耗时并且频次较高的任务,可以分布在其他不耗时的时机去做,把握好时机最重要)
6.善用第三方网络请求框架
内存优化:
1.避免内存抖动(在同一时间内大量申请内存)
2.使用Lru或者WeakRef来管理大的内存(例如Bitmap)
3.在使用Bitmap时尽可能的进行采样率或者尺寸压缩(图片压缩可采用C++的赫夫曼压缩方式)
4.酌情使用Bitmap的色彩模式ARGB_8888适合显示更丰富的色彩 ARGB_4444适用在用户分辨模式较低的情景,但是在一些场合可以节省很大的内存开销。
5.在合适的情况下可以考虑使用SparseArray,ArrayMap来代替Java的一些数据结构。
6.避免在Hander或者Thread中对Context的引用,如果能用ApplicationContext代替更好,如果不能最好做Weak或者Lru的处理
7.合理利用static final 修饰符
8.在一些合适的场合下尽可能的使用svg来代替png图片
9.减少不必要的全局变量
10.谨慎管理单利类的成员和内存(Context 是否可以使用ApplicationContext,加强对单利中的缓存池的管理,比如说List<Lisenter>,有add就要有remove)
11.避免创建不必要的对象(StringBuilder 在字符串拼装时优于’+’)
12.避免使用过多的枚举
13.for循环中采用c的分离方式设计(for(int i;xx.getSize();i++)) getSize 可以被分离,考虑是否可以使用for-each。
14.合理使用第三方的处理类库
15.对数据库对象的操作要谨慎比如Cursor对象
15.对于IO流操作要谨慎,及时close
16.尝试使用静态内部类代替内部类
17.尽可能的选用一些C++优秀的开源项目来提升性能和内存
18.当需要处理gif图片时就可以尝试使用libgif的C++开源项目渲染
19.尝试变更App的布局方式(可能要与产品沟通实现方案,尽量避免ViewPager嵌套ViewPager,TabCard嵌套TabCard这种需求)
20.在做数据转移时尝试是否可以使用System.arraycopy()
21.尽可能的使用Java代码来写布局
22.检查你得广播中是否有一些恶性的代码?还有是否解除了广播关系