浅析安卓(Android)的性能优化

 更新时间:2016年08月31日 09:00:09   作者:爱小丽  
性能优化是一个大的范畴,如果有人问你在Android中如何做性能优化的,也许都不知道从哪开始说起。那么这篇文章我们从布局优化和内存优化两个方面来展开说如何进行Android的性能优化。

Android性能的优化主要分为两点

1、布局优化

2、内存优化

布局优化

首先来看一下布局优化,系统在渲染UI的时候会消耗大量的资源,所以,对布局的优化就显得尤为重要

避免Overdraw

也就是避免过度的绘制,过度的绘制会浪费更多的资源,举个例子,Android系统会默认绘制Activity的背景,这时候我们再设置一个背景,这样默认的背景就属于过度绘制了,在『开发者工具』中有一个『调试GPU过度绘制』的选项,我们打开就可以通过颜色来判断过度绘制的次数

如图:

所以说我们尽可能的增大蓝色区域,减少红色区域

优化布局层级

在Android系统中,系统对View进行测量、布局、绘制的时候,都是通过对View树的遍历来进行的,所以说一个布局的层级太多,就会严重影响测量、布局、绘制的速度,所以要降低View树的高度,Google在文档中建议布局的层级不超过10层,所以还要避免嵌套没有用的布局

使用include标签

相信大家都会在项目的时候遇到toolbar,或者一个UI在多个界面使用的问题,遇到这种问题的时候我们一般都会用include(毕竟大神『第一行代码』教的好),这样就减少了代码冗余,而且还利于后期更改

使用ViewStub实现View的延时加载

ViewStub标签和View.GONE的方式差不多,但是ViewStub只会在显示的时候去渲染,而GONE在初始化的时候就已经渲染完毕了,所以相比来说ViewStub的效率更高。

下面来通过代码使用一下ViewStub

首先我们定义一个布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical" android:layout_width="match_parent"
 android:layout_height="match_parent">

 <TextView
  android:id="@+id/tv"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content" />

</LinearLayout>

这里面只放了一个TextView,然后我们在自己的布局中通过ViewStub来引用他

<Button
 android:id="@+id/btn"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content" />

<ViewStub
 android:id="@+id/vs"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout="@layout/view_stub"/>

这里的逻辑是点击按钮然后出现ViewStub引用的布局(也就是我们上面写的那个布局文件)

findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View view) {
  ViewStub vs = (ViewStub) findViewById(R.id.vs);
  View vsView = vs.inflate();
  TextView tv = (TextView) vsView.findViewById(R.id.tv);
  tv.setText("hahaha");

 }
});

这里想要把ViewStub引用的布局显示出来有两种办法,一种是ViewStub.setVisibility();另一种就是ViewStub.inflate();这两种方法的区别就是inflate()能返回引用的布局,然后可以通过这个布局来找到里面的子View来进行操作

运行程序点击按钮,就可以看到TextView已经显示出来了,并且已经赋值『hahaha』

Hierarchy Viewer

这个工具可以显示我们的布局,但是只可以在模拟器和工厂的Demo机上用,不过Google的大神提供了一个开源的项目ViewServer,有兴趣的可以看一下。

这个就不过多阐述了,有兴趣的可以自行查看一下相关的资料

内存优化

我们都知道,最近Android的厂商就是在拼配置,其中我们最关注的就是内存几个G,但是Android手机有的内存很大,但是很卡,这是因为有的手机软件在手机内存低的情况下不能被杀死,也就是我们说的『防杀』

我们知道内存一般分为这几个部分

     1、寄存器

     2、栈

     3、堆

     4、静态存储区

     5、常量池

其中寄存器运算速度最快,但是我们在程序里无法控制

栈里存放基本数据类型

堆里存放对象和数组,在堆中的一般由Java的GC还管理

静态存储区在固定的位置存放应用程序中运行时一直存在的数据,Java专门划分了一个区域来管理静态变量

常量池就是该类型所使用到的常量的集合

Bitmap的优化

我们都知道在Android中是造成OOM的最大威胁,因为它占用的内存特别多,所以我们应该:

1、使用适当分辨率大小的图片

由于Android在做适配的时候会对不同分辨率的文件夹下的图片来进行缩放适配,如果图片的分辨率与资源分辨率不匹配的话就会导致消耗更多的资源

2、使用缓存

一般有内存缓存和硬盘缓存

代码优化

     1、对常量使用static

     2、使用静态方法,静态方法比普通方法提高15%左右的访问速度

     3、减少没有必要的成员变量,如果能定义成局部变量就最好定义成局部变量

     4、减少不必要的对象

     5、少用枚举、迭代器

     6、对CursorReceiverFile等对象,要注意回收和取消注册

     7、使用SurfaceView来代替View进行大量并且频繁的绘图操作

     8、尽量使用视图缓存,不是每次都执行inflate()来解析视图

     9、避免使用反射

     10、使用RenderScriptOpenGL来进行非常复杂的绘图操作

总结

以上就是对Android性能优化的一些点,如果你用AndroidStudio的话,AndroidStudio提供了一个内存监视的工具,还是很好用的,如果你没用AndroidStudio,那么我建议你使用AndroidStudio~

另外优化也没有绝对的完美,每一次优化都是基于当前的环境来做的,要明白沟通是最好的优化,不盲从,不随便,三思而后行。希望这篇文章对大家开发Android能有所帮助。

相关文章

  • 基于Android自定义控件实现雷达效果

    基于Android自定义控件实现雷达效果

    这篇文章主要为大家详细介绍了基于Android自定义控件实现雷达效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • 实例讲解Android中的AutoCompleteTextView自动补全组件

    实例讲解Android中的AutoCompleteTextView自动补全组件

    AutoCompleteTextView组件被用在输入框中能实现输入内容自动补全的功能,类似于大家平时用Google时的输入联想,这里我们来用实例讲解Android中的AutoCompleteTextView自动补全组件,特别是实现邮箱地址补全的例子,非常实用
    2016-05-05
  • Android RxJava创建操作符Timer的方法

    Android RxJava创建操作符Timer的方法

    这篇文章主要为大家详细介绍了Android RxJava创建操作符Timer的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • 360浏览器文本框获得焦点后被android软键盘遮罩该怎么办

    360浏览器文本框获得焦点后被android软键盘遮罩该怎么办

    最近接了个项目,项目需求是这样的,站点上筛选按钮点击后弹出层(fixed),当输入框获取焦点以后弹出系统自带的软键盘,在android上十款浏览器挨个测试比对,发现在360浏览器弹出键盘以后获取焦点的文本框被软键盘覆盖了,下面分享我的解决办法
    2015-12-12
  • Android Fragment的具体使用方式详解

    Android Fragment的具体使用方式详解

    Fragment是Android3.0后引入的一个新的API,他出现的初衷是为了适应大屏幕的平板电脑, 当然现在他仍然是平板APP UI设计的宠儿,而且我们普通手机开发也会加入这个Fragment, 我们可以把他看成一个小型的Activity,又称Activity片段
    2022-12-12
  • Android指纹识别功能

    Android指纹识别功能

    这篇文章主要为大家详细介绍了Android指纹识别功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • Android开发实战之漂亮的ViewPager引导页

    Android开发实战之漂亮的ViewPager引导页

    这篇文章主要介绍了Android开发实战中漂亮ViewPager引导页的制作过程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • 安卓APP测试之使用Burp Suite实现HTTPS抓包方法

    安卓APP测试之使用Burp Suite实现HTTPS抓包方法

    这篇文章主要介绍了安卓APP测试之使用Burp Suite实现HTTPS抓包方法,本文详解讲解了测试环境和各个软件的配置方法,需要的朋友可以参考下
    2015-04-04
  • android阅读器长按选择文字功能实现代码

    android阅读器长按选择文字功能实现代码

    本篇文章主要介绍了android阅读器长按选择文字功能实现代码,具有一定的参考价值,有兴趣的可以了解一下
    2017-07-07
  • Android中修改TabLayout底部导航条Indicator长短的方法

    Android中修改TabLayout底部导航条Indicator长短的方法

    Tablayout在我们日常开发中经常会遇到,下面这篇文章主要给大家介绍了在Android中修改TabLayout底部导航条Indicator长短的方法,文中给出了详细的示例代码供大家参考学习,需要的朋友们下面来一起看看吧。
    2017-06-06

最新评论