android性能优化之布局嵌套简化

好不容易做出一个app,但是卡顿、ANR、占用内存高,怎么办?
路漫漫其修远兮,主要影响因素有这么几点

一、占用内存、CPU高

分析工具:android studio自带的profile工具,可以分析查看内存、CPU、网络带宽等情况,如图:

image.png
二、内存泄露

分析工具:LeakCanary
github地址:https://github.com/square/leakcanary
会告诉你哪里有内存泄露,特别注意字段使用。

image.png
三、界面卡顿,布局优化

这里主要是自定义组合控件,复用控件的使用。
尽量使用merge、include标签,深布局尽量Relativelayout替代linearLayout。
参考资料:https://blog.csdn.net/iluojie/article/details/80631775

这个今天着重讲一下:
例如自定义组合控件布局(由于自定义组合控件会集成LinearLayout或相对布局,所以xml的根布局使用merge就可以减少一层嵌套):

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<TextView
    android:id="@+id/tv_no_chat_history"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/no_chat_history"
    android:textColor="@color/color_4d4d4d"
    android:textSize="@dimen/text_size_14"
    android:visibility="gone"
    android:layout_marginTop="@dimen/margin_largger_1_5x"
    android:layout_gravity="center_horizontal"/>
<cn.droidlover.xrecyclerview.XRecyclerContentLayout
    android:id="@+id/xrc_small_chat"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:visibility="visible"
    android:scrollbarThumbVertical="@drawable/shape_small_head_scrollbar_thumb"
    app:recyclerBackgroundColor="@color/small_chat_bg"/>

</merge>

那么,merge是不能设置属性的(设置了也无效),所以需要在组合控件的构造方法中初始化属性,如:

private void initRootAttr(){
    //初始化跟布局的属性
    this.setBackgroundResource(R.drawable.bg_big_chat_left);
    this.setOrientation(LinearLayout.VERTICAL);
    int padding15 = ScreenUtil.dpToPx(getResources(),15);
    int padding8 = ScreenUtil.dpToPx(getResources(),8);
    int padding5 = ScreenUtil.dpToPx(getResources(),5);
    this.setPadding(padding15,padding8,padding8,padding5);
    }

还有一类就是include和merge结合使用的场景,如:公共返回按键
在LoginActivity的xml中

<...
<LinearLayout
    android:id="@+id/ll_back"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:paddingTop="@dimen/padding_largger"
    android:layout_alignParentBottom="true"
    android:orientation="vertical">
    <include layout="@layout/view_back_common" />
</LinearLayout>
.../>

对应的view_back_common布局如下:

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<ImageView
    android:id="@+id/iv_back"
    android:layout_width="@dimen/image_line_small"
    android:layout_height="@dimen/image_line_small"
    android:layout_gravity="center_horizontal"
    android:src="@drawable/selector_circle_back" />
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/back"
    android:layout_marginTop="@dimen/margin_largger"
    android:layout_gravity="center_horizontal"
    android:layout_marginBottom="@dimen/margin_largger"
    android:textSize="@dimen/text_size_14"/>
</merge>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值