布局优化
布局优化也就是这三个标签的使用,merge,ViewStub,include
include标签主要作用是代码的重用,比如我们要使用的某个布局被多个布局使用,就可以使用include标签引入,避免冗余代码。
merge标签的作用主要是减少布局的层级,布局层级越深,cpu计算需要的时间就越多,我们所谓的16ms完成计算并渲染就变难了。我们可以通过hierarchyviewer查看我们的布局,通过查看可以知道我们的布局全被写在一个FrameLayout的布局里,当我们的activity根布局为FrameLayout时就重复嵌套了一个多余的布局。使用merge时我们要注意两点
- merge只可以作为布局的根节点
- 当需要扩充的布局本身是由merge作为根节点的话,需要将布局至于ViewGroup中,同时需要设置attachToRoot设置为true
ViewStub的主要作用是延迟加载,延迟加载的功非常重要,特别是在界面显示的内容比较多并且所占空间比较大时。ViewStub是一个不可见的、大小为0的视图,最佳用途就是实现View的延迟加载,在需要的时候再加载View。
当调用VIewSub的setVisibility()函数设置为可见或调用inflate初始化该View的时候,ViewStub引用的资源开始初始化,然后VIewSub引用的资源替代ViewStub自己的位置。在没有setVisibility可见或inflate之前,ViewStub一直存在组件树的层级结构中。但是由于ViewStub非常轻量级,所以对性能影响非常小。
<ViewStub android:id="@+id/stub"
android:inflatedId="@+id/subTree"
android:layout="@layout/mySubTree"
android:layout_width="120dp"
android:layout_height="120dp" />
在上述代码中定义了VIewStub,这可以通过id “stub”来找到。在初始化资源mySubTree后,从父组件删除了ViewStub,然后mySubTree代替了stub的位置。
ViewStub stub=findviewById(R.id.stub);
View inflated=stub.inflate();
当调用函数inflate时,ViewStub被引用的资源代替,并且返回引用的View而不需要再用findViewById来查找了
注意:ViewStub暂时还不支持merge标签
总结:
1.避免不必要的嵌套,不要把一个布局放置在其他布局里,除非是必须的
2.避免使用太多视图,在一个布局里没增加一个新的视图,都会在过度操作时消耗很多资源和时间
3.避免嵌套太深
Bitmap的简单优化
这里不讲三级缓存,只是简单的优化。当我们加载一招图片时,如果图片过大,而我们没有足够多的内存,毕竟我们不可能使用手机所有的内存,就会发生OOM。图片过大就是我们加载了高分辨率不图片到内存,我们其实并用不了多么高的分辨率,根据手机本身加载最好。这时我们就要使用BitmapFactory.Options设置inSampleSize来缩放图片。
我们需要先设置inJustDecodeBounds为true来达到在不加载图片到内存的情况家获取图片的宽高。
BitmapFactory.Options options=new BitmapFactory.Options();
//在不加载进内存的情况下获取宽高
options.inJustDecodeBounds=true;
Bitmap bitmap = BitmapFactory.decodeFile("",options);//加载图片,并未装载进内存
int width=options.outWidth;
int height=options.outHeight;
//通过我们要显示的大小比较实际大小进行缩放
。。。。。
options.inSampleSize=xxx;//2代表狂傲都变为1/2
options.inJustDecodeBounds=false;
options.inDither=true;//在N以上版本被忽略,抖动解码。因为降低了像素点的位数所以有些色彩在低位数颜色中不存在,会填充相近颜色填充,当一大片都哦那个一个颜色填充会产生一些断裂色带,设置为true用随机噪声色填充
options.inPreferredConfig = Bitmap.Config.RGB_565;//减少像素点所占内存
Bitmap finalBitmap = BitmapFactory.decodeFile("",options);