1、如何优化 Android 的布局性能?你会如何使用 ConstraintLayout 来减少嵌套层级?优化 Android 布局性能是提升应用流畅性的关键步骤。...避免 RelativeLayout 内多层嵌套:单层 RelativeLayout 的测量复杂度是 O(n²),嵌套后性能急剧下降。示例: 嵌套层级?性能瓶颈:嵌套的 ViewGroup(如 LinearLayout 嵌套)会增加 measure 和 layout 的计算复杂度。...性能优化:相比 RelativeLayout 或嵌套 LinearLayout,ConstraintLayout 的测量效率更高。...-- 传统方式:3层嵌套 -->LinearLayout> LinearLayout> RelativeLayout> <!
本篇文章会给你一个满意的答案。 1.布局优化工具 在讲到如何去布局优化前,我们先来学习两种布局优化的工具。...Hierarchy Viewer Hierarchy Viewer是Android SDK自带的可视化的调试工具,用来检查布局嵌套和绘制的时间。...从这里我们就可以看出我们用RelativeLayout减少了一层的布局,当然这只是一个简单例子,如果布局复杂,那么合理的用RelativeLayout来替代LinearLayout会减少很多层布局。...一般情况下,RelativeLayout的性能是比LinearLayout低,因为RelativeLayout中的View的排列方式是基于彼此依赖的。...View的OnDraw中同一区域绘制多次。 过度绘制是不可避免的,但是过多的过度绘制会浪费很多资源,并且导致性能问题,因此,避免过度绘制是十分必要的。
严重影响性能,需要优化,避免深红色区域。...优化方法 合理选择 RelativeLayout/LinearLayout RelativeLayout 层级低,但如果彼此依赖,在确定位置时,会给所有子 View 做一次排序,然后重新测量,因为会引起多次测量...尽量不要嵌套使用 RelativeLayout。尽量不要在嵌套的 LinearLayout 中都使用 weight 属性。...include、merge、ViewStub 的使用 使用 ConstraintLayout 降低层级 避免过度绘制 使用 Android 自带的一些主题时,Activity 的 DecorView...用 SurfaceView 或 TextureView 代替普通 View。SurfaceView 或 TextureView 可以通过将绘图操作移动到另一个单独线程上提高性能。
Scrollview将两者嵌套进去,效果是实现了,但是Scrollview嵌套Viewpager的弊端显而易见!...而第二版即本篇博客并不是为了解决Scrollview嵌套Viewpager的问题,而是换一种思路去实现! 布局结构图,很简单,就两层: image.png RelativeLayout 搜索栏.../> RelativeLayout> 就是将第一版中的第一层和第二层(自定义JdScrollVIew)放在了Tab1的fragment中:...其实,这里取了一个巧,MainActivity中的有一个TabLayout,而tab1也就是首页中的Fragment也包含了一个一摸一样的TabLayout(NestedScrollview嵌套TabLayout...中,这样也就避免了使用ScrollView嵌套Viewpager这种模式!
父布局 对于ViewGroup的选择问题:推荐FrameLayout > LinearLayout > RelativeLayout(为了优化布局,RelativeLayout会调用childrenView...的onMeasure()两次),推荐阅读:LinearLayout与RelativeLayout的性能比较 尽量不要嵌套使用RelativeLayout....尽量不要在嵌套的LinearLayout中都使用weight属性....避免使用多重布局嵌套,层级能少就少 善用TextView的Drawable减少布局层级 背景色 去掉多余的布局背景色,比如ScrollView包裹的内容分为两段,第一段使用的是match_parent的宽...)或设置->开发者选项->显示布局边界查看。
我想知道的是为什么是RelativeLayout而不是LinearLayout?如果有可靠的数据支持的话再好不过,先谢过。...猫叔: Google的意思是“性能至上”, RelativeLayout 在性能上更好,因为在诸如 ListView 等控件中,使用 LinearLayout 容易产生多层嵌套的布局结构,这在性能上是不好的...而 RelativeLayout 因其原理上的灵活性,通常层级结构都比较扁平,很多使用LinearLayout 的情况都可以用一个 RelativeLayout 来替代,以降低布局的嵌套层级,优化性能。...对于简单的布局,或者使用 LinearLayout 的嵌套布局层次不多的情况下。还是推荐 使用 LinearLayout 来实现。 因为 LinearLayout 布局性能更高一点,为什么?...因为 RelativeLayout 布局需要至少计算两次。 知乎:px、dp、dip、dpi、sp 等到底有什么联系区别?产生的根源和设计时的影响如何?是否屏幕密度的决定原因?
---- 现象:Null判断疲劳 ---- 嵌套对象获取属性时: String city = student.getAddress().getCity().getCityCode(); 每个属性访问的时候都有可能导致...cityCode Java8 提供的类安全导航操作java.util.Optional类 ---- java.util.Optional类,虽然不能像groovy一样有那么便利的安全导航操作符简化了重复的空指针判断操作...getCityCode) .orElse("Unknown"); 总结 ---- 使用 java.util.Optional类,结合Optional.ofNullable及map方法,避免了重复的空指针判断...,有点类似使用groovy语言的安全导航操作符一样。...希望java以后的版本中,出现真正的这样的操作符,避免敲那么多字符。 ----
答:一个用于加载布局的系统服务,就是实例化与Layout XML文件对应的View对象,不能直接使用, 需要通过getLayoutInflater( )方法或getSystemService( )方法来获得与当前...id ②为该布局的外部再嵌套一层父布局,如果不需要的话,写null就可以了!...root不为null,attachToRoot为true的话,会在加载的布局文件最外层嵌套一层root布局; 为false的话,则root失去作用!...(左,上,右,下); ——Step 3: 将组件或容器添加到容器中,这个时候我们可能需要设置下组件的添加位置,或者设置他的大小: 我们需要用到一个类:LayoutParams,我们可以把它看成布局容器的一个信息包...3.Java代码动态添加控件或xml布局 第二点我们讲解了使用纯Java代码来加载布局,实际当中用得并不多,更多的时候是动态 的添加View控件以及动态的加载XML布局!
/> RelativeLayout> include标签使用还是很简单的,主要通过layout属性声明要引入的布局即可。运行程序界面如下: ?...看到了吧,我们自己布局减少了一层嵌套,从而提升了UI的渲染速度。...merge标签使用注意点: 1,根布局是FrameLayout且不需要设置background或padding等属性,可以用merge代替,因为Activity的ContentView父元素就是FrameLayout...重写包含的layout布局文件的根容器id; inflate()方法 与setVisible(int)方法作用类似,都可以使内容得以显示,只是inflate()会返回一个View对象,避免了额外使用...因此这有可能导致加载出来的布局存在着多余的嵌套结构,具体如何去取舍就要根据各自的实际情况来决定了。 2,ViewStub的inflate只能被调用一次,第二次调用会抛出异常。
下面我将我的代码贴出来,大家可以参考,或修改。...在这里我们用的是新建的xml,名称为left_menu.xml 逻辑也是很简单的 内部逻辑: 用一个水平排列的LinearLayout 在LinearLayout内部嵌套RelativeLayout...(虽然这样嵌套可能会导致性能收到影响,但我们现在重在理解这个过程) 在每个RelativeLayout中在添加ImageView和TextView 这样我们要实现的左边菜单栏,默认隐藏的菜单栏就写好了,...> LinearLayout> RelativeLayout> 其中str中引用的图片请自行准备。。。...> LinearLayout> RelativeLayout> 在MainActivity
在布局代码中,使用什么布局基本遵守以下规则: 如果布局中既可以使用LinearLayout也可以使用RelativeLayout,那么就采用LinearLayout,这是因为RelativeLayout...如果布局需要通过嵌套的方式来完成。这种情况下还是建议采用RelativeLayout,因为ViewGroup的嵌套就相当于增加了布局的层级,同样会降低程序的性能。...3.使用或标签和ViewStub,提取布局中公共部分的布局,可提高布局初始化效率。 绘制优化 绘制优化就是不要再view的onDraw方法中做大量操作。...线程优化 线程优化的思想是采用线程池,避免程序中存在大量的Thread。...线程池可以重用内部的线程,从而避免了线程的创建和销毁所带来的性能开销,同时线程池还能有效地控制线程池的最大并发数,避免大量的线程因互相抢占系统资源从而导致阻塞现象的发生。
(3) 标签 在使用了include后可能导致布局嵌套过多。多余不必要的layout节点。...从而导致解析变慢,不必要的节点和嵌套可通过hierarchy viewer(以下布局调优工具中有详细介绍)或设置->开发人员选项->显示布局边界查看。 merge标签可用于两种典型情况: a....2、去除不必要的嵌套和View节点 (1) 首次不须要使用的节点设置为GONE或使用viewstub (2) 使用RelativeLayout取代LinearLayout 大约在Android4.0...新建project的默认main.xml中顶节点是LinearLayout,而在之后已经改为RelativeLayout,由于RelativeLayout性能更优,且能够简单实现LinearLayout...嵌套才干实现的布局。
在布局代码中,使用什么布局基本遵守以下规则: 1.如果布局中既可以使用LinearLayout也可以使用RelativeLayout,那么就采用LinearLayout,这是因为RelativeLayout...2.如果布局需要通过嵌套的方式来完成。这种情况下还是建议采用RelativeLayout,因为ViewGroup的嵌套就相当于增加了布局的层级,同样会降低程序的性能。...3.使用或标签和ViewStub,提取布局中公共部分的布局,可提高布局初始化效率。 2.绘制优化 绘制优化就是不要再view的onDraw方法中做大量操作。...7.线程优化 线程优化的思想是采用线程池,避免程序中存在大量的Thread。...线程池可以重用内部的线程,从而避免了线程的创建和销毁所带来的性能开销,同时线程池还能有效地控制线程池的最大并发数,避免大量的线程因互相抢占系统资源从而导致阻塞现象的发生。
所以我们在开发过程中都会尽量避免布局嵌套现象,但是一些复杂的显示效果必须要嵌套才能显示(PS:可以使用merge标签,自定义布局,比较麻烦)。这就有个矛盾。...下面列举几点来表明ConstraintLayout是如何能解决这个矛盾,它的强大之处。 Constraint Layout可以在不嵌套view group的情况下实现非常庞大、复杂的布局。...拖拽方式来使用ConstraintLayout 说说LinearLayout和RelativeLayout 说到布局的时候就会条件性的想到LinearLayout线性步局,RelativeLayout相对布局...这类属性的作用。它是控制控件的位置的。和RelativeLayout有点像,但还是不一样的。 偏斜(Bias) 说到Bias,我们先提一下在ConstraintLayout如何实现居中效果。...他融合了RelativeLayout和LinearLayout的优点,比如相对位置,weight chains。并且他又多出来很多RelativeLayout和LinearLayout不具备的优点。
,不必要的节点和嵌套可通过hierarchy viewer(下面布局调优工具中有具体介绍)或设置->开发者选项->显示布局边界查看。...去除不必要的嵌套和View节点 (1) 首次不需要使用的节点设置为GONE或使用viewstub (2) 使用RelativeLayout代替LinearLayout 大约在Android4.0...之前,新建工程的默认main.xml中顶节点是LinearLayout,而在之后已经改为RelativeLayout,因为RelativeLayout性能更优,且可以简单实现LinearLayout嵌套才能实现的布局...分析到activity_main.xml的布局文件时,发现这里使用了多个嵌套的LinearLayout布局,而且每个LinearLayout都会使用一次android:background设置一次自己的背景颜色...仔细分析在其中一个嵌套ImageView的LinearLayout布局背景颜色与最外层的背景颜色是一样的,属于不需要的背景色,因此将这个LinearLayout中的android:background属性删除
归档周期以及归档路径都是可以自定义的。如图所示:以下操作基于知行之桥2022版。如何找到Archive文件夹的路径?...如果您的EDI系统是安装在Linux下的,可以在如下路径找到Archive文件夹:清理文件后如何启动知行之桥EDI系统?...如图所示:为避免出现磁盘已满然后紧急清理的情况,最佳的方法是提前对磁盘空间进行监控,一旦超出预警值,便及时进行清理,防患于未然。...遇到硬盘问题导致服务器宕机这种情况,只需要重启服务器就能恢复了,成本也不是很高,就能避免服务器宕机带来的损失。具体的步骤大家可以参考这个链接:如何创建镜像卷?...搭建HA(高可用)环境:高可用的搭建可以避免单点故障,避免出现由于故障导致EDI系统无法正常运行。配置错误邮件提醒,周/日报:第一时间获知EDI系统遇到的网络异常或者数据异常等情况。
例如,使用嵌套的 LinearLayout 可能会使得 View 的层级结构过深,此外,嵌套使用了 layout_weight 参数的 LinearLayout 的计算量会尤其大,因为每个子元素都需要被测量两次...这对需要多次重复 inflate 的 Layout 尤其需要注意,比如嵌套在 ListView 或 GridView 时。...可以看到,渲染一个完整的列表项的时间就是: 测量: 0.977ms 布局: 0.167ms 绘制: 2.717ms ---- 修正 Layout 上面的 Layout 由于有这个嵌套的 LinearLayout...所以,当换成基于 RelativeLayout 的设计时,你的 Layout 变成了两层。新的 Layout 变成这样: ?...尝试使用更扁平的 Layout ,比如 RelativeLayout或 GridLayout 来提高性能。一般最多不超过10层。
布局 布局,我们在做安卓App时,会有很多的布局控件,这些控件要得到合理的摆放,而这所有的控件布局都是继承ViewGroup类的子类,布局控件,有我们常见的布局控件,也有嵌套布局。...布局有: FrameLayout(帧布局) LinearLayout(线性布局) TableLayout(表格布局) RelativeLayout(相对布局) AbsoluteLayout(绝对布局)...LinearLayout(线性布局),是常用的布局,以水平和垂直排列。 TableLayout(表格布局),在表格布局中,每一行为一个TableRow,每一个单元格内是一个View对象。...RelativeLayout(相对布局),常用布局。 AbsoluteLayout(绝对布局),这个布局一般情况下,我不推荐使用,这个布局由坐标固定住,而坐标的固定太没有灵活性。...了解嵌套布局 嵌套布局可以试试,登录界面模块就有,合理地使用嵌套布局可以使界面变得更加简洁,很美观。 总结 布局的使用,要慢慢练习并加以熟悉就行。
作为开发人员,我们的目标只有一个:保证稳定的帧率来避免卡顿。...贴出这个布局的代码(贴出后超过公众号字数限制,可以点击查看原文查看布局代码)。 每一行布局都使用RelativeLayout嵌套来做,而且设置了多重颜色。...对比一下优化后的布局的颜色,可以看出Overdraw降到了可以接受的程度。 备注:有些过度绘制都是不可避免的,需要结合具体的布局场景具体分析。...的影响,类如RelativeLayout、LinearLayout等经常需要measure两次才能完成,而嵌套、相互嵌套、深层嵌套等的发生会使measure次数呈指数级增长,所费时间呈线性增长; 由此得到结论...同样的UI效果可以使用不同的布局来完成,我们需要考虑使用少的嵌套层次以及控件个数来完成,例如设置界面的普通一行,可以像之前一样使用RelativeLayout嵌套TextView以及ImageView来实现
在前面几篇文章当中,我们学习了如何通过合理管理内存,以及高性能编码技巧的方式来提升应用程序的性能。...相信大家已经可以看出来了吧,这个内部的LinearLayout就是一个多余的布局嵌套,实际上并不需要这样一层,让两个按钮直接包含在外部的LinearLayout当中就可以了。...而这个多余的布局嵌套其实就是由于布局引入所导致的,因为我们在ok_cancel_layout.xml中也定义了一个LinearLayout。那么应该怎样优化掉这个问题呢?...OK,可以看到,现在EditText和两个按钮都直接包含在了LinearLayout下面,我们的profile.xml当中也就不存在多余的布局嵌套了。...另外需要提醒大家一点,ViewStub所加载的布局是不可以使用标签的,因此这有可能导致加载出来的布局存在着多余的嵌套结构,具体如何去取舍就要根据各自的实际情况来决定了,对于那些隐藏的布局文件结构相当复杂的情况
领取专属 10元无门槛券
手把手带您无忧上云