Android 优化总结( 三 )


2.9 其他原因
静态集合使用不当导致的内存泄漏有时候我们需要把一些对象加入到集合容器(例如ArrayList)中 , 当不再需要当中某些对象时 , 如果不把该对象的引用从集合中清理掉 , 也会使得GC无法回收该对象 。如果集合是static类型的话 , 那内存泄漏情况就会更为严重 。因此 , 当不再需要某对象时 , 需要主动将之从集合中移除 。不需要用的监听未移除会发生内存泄露问题代码
//add监听 , 放到集合里面tv.getViewTreeObserver().addOnWindowFocusChangeListener(new ViewTreeObserver.OnWindowFocusChangeListener() { @Override public void onWindowFocusChanged(boolean b) { //监听view的加载 , view加载出来的时候 , 计算他的宽高等 。}});解决办法
//计算完后 , 一定要移除这个监听tv.getViewTreeObserver().removeOnWindowFocusChangeListener(this);注意事项:
【Android 优化总结】tv.setOnClickListener();//监听执行完回收对象 , 不用考虑内存泄漏tv.getViewTreeObserver().addOnWindowFocusChangeListene,add监听 , 放到集合里面 , 需要考虑内存泄漏3.布局优化3.1 include优化
重用布局文件标签可以允许在一个布局当中引入另一个布局 , 那么比如说我们程序的所有界面都有一个公共的部分 , 这个时候最好的做法就是将这个公共的部分提取到一个独立的布局中 , 然后每个界面的布局文件当中来引用这个公共的布局 。如果我们要在标签中覆写layout属性 , 必须要将layout_width和layout_height这两个属性也进行覆写 , 否则覆写效果将不会生效 。标签是作为标签的一种辅助扩展来使用的 , 它的主要作用是为了防止在引用布局文件时引用文件时产生多余的布局嵌套 。布局嵌套越多 , 解析起来就越耗时 , 性能就越差 。因此编写布局文件时应该让嵌套的层数越少越好 。举例:比如在LinearLayout里边使用一个布局 。里边又有一个LinearLayout , 那么其实就存在了多余的布局嵌套 , 使用merge可以解决这个问题 。
3.2 ViewStub优化
仅在需要时才加载布局[ViewStub]某个布局当中的元素不是一起显示出来的 , 普通情况下只显示部分常用的元素 , 而那些不常用的元素只有在用户进行特定操作时才会显示出来 。举例:填信息时不是需要全部填的 , 有一个添加更多字段的选项 , 当用户需要添加其他信息的时候 , 才将另外的元素显示到界面上 。用VISIBLE性能表现一般 , 可以用ViewStub 。ViewStub也是View的一种 , 但是没有大小 , 没有绘制功能 , 也不参与布局 , 资源消耗非常低 , 可以认为完全不影响性能 。ViewStub所加载的布局是不可以使用标签的 , 因此这有可能导致加载出来出来的布局存在着多余的嵌套结构 。自定义全局的状态管理器【充分使用ViewStub】针对多状态 , 有数据 , 空数据 , 加载失败 , 加载异常 , 网络异常等 。针对空数据 , 加载失败 , 异常使用viewStub布局 , 一键设置自定义布局 , 也是优化的一种 。项目地址:
3.3 merge优化
视图层级这个标签在UI的结构优化中起着非常重要的作用 , 它可以删减多余的层级 , 优化UI 。但是就有一点不好 , 无法预览布局效果!
3.4 其他建议
减少太多重叠的背景(overdraw)这个问题其实最容易解决 , 建议就是检查你在布局和代码中设置的背景 , 有些背景是隐藏在底下的 , 它永远不可能显示出来 , 这种没必要的背景一定要移除 , 因为它很可能会严重影响到app的性能 。如果采用的是selector的背景 , 将normal状态的color设置为”@Android:color/transparent”,也同样可以解决问题 。避免复杂的Layout层级这里的建议比较多一些 , 首先推荐使用Android提供的布局工具Hierarchy Viewer来检查和优化布局 。第一个建议是:如果嵌套的线性布局加深了布局层次 , 可以使用相对布局来取代 。第二个建议是:用标签来合并布局 。第三个建议是:用标签来重用布局 , 抽取通用的布局可以让布局的逻辑更清晰明了 。记住 , 这些建议的最终目的都是使得你的Layout在Hierarchy Viewer里变得宽而浅 , 而不是窄而深 。总结:可以考虑多使用merge和include , ViewStub 。尽量使布局浅平 , 根布局尽量少使用RelactivityLayout,因为RelactivityLayout每次需要测量2次 。


推荐阅读