大家好,今天给各位分享深入解析Android系统性能优化(系列十)的一些知识,其中也会对进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!
首先我们来说说include/、merge/、ViewStub。如果您清楚这部分,可以跳过。
1、 include/重用
例如,如果我们要写一个TitleBar(title_bar_layout.xml),它看起来像这样。
?xml version="1.0"encoding="utf-8"?预览效果如下
Include 每个项目中都有一个TitleBar,所以使用include/进行统一管理。使用的时候一行代码就可以了。
?xml version="1.0"encoding="utf-8" ?其实我们一般都是将TitleBar封装成控件来使用。
2、 merge/减少视图层级
为什么要减少视图层次结构?加载布局时,rinflater 通过深度优先遍历构造视图树。每次解析一个View时,都会递归调用rinflater,直到该路径的最后一个元素,然后回溯。过来将每个View添加到它们的parent中,整个View树就构建完成了。使用include后,可能会导致过多的布局嵌套和不必要的布局节点,导致解析缓慢。这时候我们就可以使用merge/tag了。 merge/标签可以在两种典型情况下使用:
布局的顶层节点是一个FrameLayout,不需要设置background或者padding等属性。您可以使用合并来代替。因为Activity内容视图的父视图是一个FrameLayout,所以可以使用merge来只消除一个。当一个布局作为子布局包含在另一个布局中时,请使用merge 作为布局的顶部节点。这样,顶级节点在引入时会自动忽略,其所有子节点都会合并到主布局中。为了更好地理解这两种情况,我们回顾一下DecroView。我们先来看DecroView是Activity的顶级View,继承与FramLayout,内部有一个竖直方向的LinerLayout,上面是标题栏,下面内容栏,内容栏是我们Activity的setContentView的布局,这个内容栏是个FramLayout。DecroView的第一种情况。我们通过View Hierarchy工具来看一下,如图:
我发现有一个不需要的FrameLayout。使用合并/修改。
?xml 版本="1.0"编码="utf-8"?我们通过View Hierarchy工具来看看,如图:
使用合并/修改后,我们看第二种情况
例如,如果您有一个布局是一个垂直的LinearLayout,其中包含两个可以在其他布局中重用的连续View,那么您将创建一个包含这两个View 以便重用的LinearLayout。然而,当使用另一个LinearLayout来嵌套这个可重用的LinearLayout时,这种嵌套LinearLayout的方式除了降低你的UI性能之外没有任何意义。
为了避免这种情况,您可以用合并/元素替换可重用布局的根节点。例如:
3、ViewStub延迟加载
延迟加载是指我们可以将Layout中的View批量解析并加载到内存中。比如我们先加载Loading布局,等待网络请求,然后加载常规显示布局。当网络请求发生错误或者数据为空时,会加载错误的布局。批量加载减轻了CPU和GPU的负担。 ViewStub是一个轻量级的视图,不需要尺寸信息,也不会在添加的Layout中绘制任何东西。如果ViewStub 可见或已膨胀,则ViewStub 不再存在并被膨胀的Layout 取代。所以也称为惰性控制。
?xml 版本="1.0"编码="utf-8"?注意,android:inflatedId指定的no_data_view是布局no_data_layout的根id,android:layout="@layout/no_data_layout"指定加载哪个布局。
要显示ViewStub,可以使用viewStub.infalte()或viewStub.setVisibility(View.VISIBLE),如下所示。
公共无效showEmptyView(){
//listview.setVisibility(View.GONE);
如果(mNoDataView==null){
ViewStub noDataViewStub=(ViewStub)findViewById(R.id.no_data_view);
mNoDataView=noDataViewStub.inflate();
} 别的{
mNoDataView.setVisibility(View.VISIBLE);
}
}现在你可能会问,ViewStub 和View.GONE 有什么区别。它们的共同点是一开始不会显示,但是View.GONE在布局加载时就已经被添加到了布局树中,而ViewStub只有在显示时才会渲染布局。最后注意,ViewStub加载的布局中不能存在merge。
4、能用一个View搞定的,别用两个
给公司做个广告吧。如果你想玩游戏,可以下载小熊竞技场。
看红框中的部分。通常我们将5个TextView放在一个垂直的LinerLayout中,但是我们可以这样写
?xml version="1.0"encoding="utf-8"?比如下图红框部分,我们可以使用SpannableStringBuilder
另一个例子是下图
不要使用空视图作为每个项目之间的间隔。使用边距阅读并不直观。可以使用空间控制
上图中,需求不是缺口,而是一条分界线。我们应该做什么?是使用View设置高度来实现的吗?不! LinearLayout 与ListView 一样,具有android:divider 和android:showDividers 属性。
?xml version="1.0"encoding="utf-8"?xml version="1.0"encoding="utf-8"?OK,布局优化部分就结束了。
深入解析Android系统性能优化(系列十)和的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!
【深入解析Android系统性能优化(系列十)】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
又来啦!想知道这次优化什么酷点?
有11位网友表示赞同!
期待作者能介绍一些更实用的优化技巧,比如提升流畅度的小窍门。
有14位网友表示赞同!
每次都学到很多,真希望也能像文章里一样轻松上手优化手机!
有5位网友表示赞同!
Android优化不容易啊!这篇文章肯定又有妙招吧?
有20位网友表示赞同!
性能好一点能让玩游戏更顺畅,真的期待这次优化内容。
有15位网友表示赞同!
是不是要分享一些提高电池寿命的小技巧呢?
有9位网友表示赞同!
我手机的加载速度总是有点慢啊,希望这篇文章能给我启发。
有7位网友表示赞同!
我一直想了解不同版本的Android性能差异,这篇文章会不会介绍?
有12位网友表示赞同!
安卓系统优化一直是我的痛点,好文章!
有5位网友表示赞同!
看标题才知道居然是第10篇了!真是深度研究呢!
有10位网友表示赞同!
手机后台消耗太厉害了,不知道能不能在文章里找到解决方案。
有8位网友表示赞同!
我也想学一下如何优化系统运行速度,希望能有实际操作步骤讲解。
有6位网友表示赞同!
感觉每次都只是说理论,希望这次能分享一些具体的工具或方法。
有20位网友表示赞同!
我的手机经常发热,不知道这篇文章有没有相关的解决方案?
有18位网友表示赞同!
期待作者能从多个方面介绍性能优化的技巧,比如代码优化、系统配置等等。
有13位网友表示赞同!
学习这方面的知识可以提高自己解决问题的能力,很有用!
有17位网友表示赞同!
安卓手机的兼容性怎么样?这篇文章会不会讨论这个话题?
有17位网友表示赞同!
希望作者能分享一些隐藏的功能,让我们更好地掌控手机性能!
有15位网友表示赞同!
优化完以后,手机的速度会提升很多吗?很想知道实际效果。
有7位网友表示赞同!