好不容易做出一个app,但是卡顿、ANR、占用内存高,怎么办?
路漫漫其修远兮,主要影响因素有这么几点
一、占用内存、CPU高
分析工具:android studio自带的profile工具,可以分析查看内存、CPU、网络带宽等情况,如图:
二、内存泄露
分析工具:LeakCanary
github地址:https://github.com/square/leakcanary
会告诉你哪里有内存泄露,特别注意字段使用。
三、界面卡顿,布局优化
这里主要是自定义组合控件,复用控件的使用。
尽量使用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>