浅析安卓(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能有所帮助。

(0)

相关推荐

  • Android编程开发之性能优化技巧总结

    本文详细总结了Android编程开发之性能优化技巧.分享给大家供大家参考,具体如下: 1.http用gzip压缩,设置连接超时时间和响应超时时间 http请求按照业务需求,分为是否可以缓存和不可缓存,那么在无网络的环境中,仍然通过缓存的httpresponse浏览部分数据,实现离线阅读. 2.listview 性能优化 1).复用convertView 在getItemView中,判断convertView是否为空,如果不为空,可复用.如果couvertview中的view需要添加listern

  • 浅谈Android开发中ListView控件性能的一些优化方法

    ListView优化一直是一个老生常谈的问题,不管是面试还是平常的开发中,ListView永远不会被忽略掉,那么这篇文章我们来看看如何最大化的优化ListView的性能. 1.在adapter中的getView方法中尽量少使用逻辑 2.尽最大可能避免GC 3.滑动的时候不加载图片 4.将ListView的scrollingCache和animateCache设置为false 5.item的布局层级越少越好 6.使用ViewHolder 下面就具体来看一些 1.在adapter中的getView方

  • Android中SparseArray性能优化的使用方法

    之前一篇文章研究完横向二级菜单,发现其中使用了SparseArray去替换HashMap的使用.于是乎自己查了一些相关资料,自己同时对性能进行了一些测试.首先先说一下SparseArray的原理. SparseArray(稀疏数组).他是Android内部特有的api,标准的jdk是没有这个类的.在Android内部用来替代HashMap<Integer,E>这种形式,使用SparseArray更加节省内存空间的使用,SparseArray也是以key和value对数据进行保存的.使用的时候只

  • Android性能优化方法

    GPU过度绘制 •打开开发者选型,"调试GPU过度绘制",蓝.绿.粉红.红,过度绘制依次加深  •粉红色尽量优化,界面尽量保持蓝绿颜色  •红色肯定是有问题的,不能忍受 使用HierarchyView分析布局层级 •删除多个全屏背景:应用中不可见的背景,将其删除掉  •优化ImageView:对于先绘制了一个背景,然后在其上绘制了图片的,9-patch格式的背景图中间拉伸部分设置为透明的,Android 2D渲染引擎会优化9-patch图中的透明像素.这个简单的修改可以消除头像上的过度

  • Android性能优化以及数据优化方法

    Android性能优化-布局优化 今天,继续Android性能优化 一 编码细节优化. 编码细节,对于程序的运行效率也是有很多的影响的.今天这篇主题由于技术能力有限,所以也不敢在深层去和大家分享.我将这篇主题分为以下几个小节: (1)缓存 (2)数据 (3)延迟加载和优先加载 1> 缓存 在Android中缓存可以用在很多的地方:对象.IO.网络.DB等等..对象缓存能减少内存分配,IO缓存能对磁盘的读写访问,网络缓存能减少对网络的访问,DB缓存能减少对数据库的操作. 缓存针对的场景在Andro

  • Android高级开发之性能优化典范

    本章介绍android高级开发中,对于性能方面的处理.主要包括电量,视图,内存三个性能方面的知识点. 1.视图性能 (1)Overdraw简介 Overdraw就是过度绘制,是指在一帧的时间内(16.67ms)像素被绘制了多次,理论上一个像素每次只绘制一次是最优的,但是由于重叠的布 局导致一些像素会被多次绘制,而每次绘制都会对应到CPU的一组绘图命令和GPU的一些操作,当这个操作耗时超过16.67ms时,就会出现掉帧现象,表现为应用卡顿,所以对重叠不可见元素的重复绘制会产生额外的开销,需要尽量减

  • Android开发性能优化总结

    一. 加载 预加载:1.反射注解框架Reflect信息,在Application内多线程预加载至缓存.2.资源预加载 懒加载:1.Fragment懒加载2.资源懒加载 二. 缓存 1. Http缓存,淘汰时间 2. 图片缓存,bitmap压缩,Lru淘汰,持久化二级缓存 3. 反射注解框架Reflect信息缓存,防止多次反射操作 三. 异步防止Anr 1. 避免在UI线程做太多耗时操作,IntentReceiver > 10s Anr 2. 并发操作多用读写锁,少用synchronized,An

  • Android布局性能优化之按需加载View

    有时应用程序中会有一些很少用到的复杂布局.在需要它们的时候再加载可以降低内存的消耗,同时也可以加快界面的渲染速度. 定义ViewStub ViewStub是一个轻量级的View,它没有高宽,也不会绘制任何东西.所以它的加载与卸载的成本很低.每个ViewStub都可以使用android:layout属性指定要加载的布局. 下面这个ViewStub用于一个半透明的ProgressBar的加载.它只有在新工作开始时才会显示. <ViewStub android:id="@+id/stub_imp

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

    Android性能的优化主要分为两点 1.布局优化 2.内存优化 布局优化 首先来看一下布局优化,系统在渲染UI的时候会消耗大量的资源,所以,对布局的优化就显得尤为重要 避免Overdraw 也就是避免过度的绘制,过度的绘制会浪费更多的资源,举个例子,Android系统会默认绘制Activity的背景,这时候我们再设置一个背景,这样默认的背景就属于过度绘制了,在『开发者工具』中有一个『调试GPU过度绘制』的选项,我们打开就可以通过颜色来判断过度绘制的次数 如图: 所以说我们尽可能的增大蓝色区域,

  • Android APP性能优化分析

    本文通过Android APP性能优化的四个方面做了详细分析,并对原理和重点做了详细解释,以下是全部内容: 说到 Android 系统手机,大部分人的印象是用了一段时间就变得有点卡顿,有些程序在运行期间莫名其妙的出现崩溃,打开系统文件夹一看,发现多了很多文件,然后用手机管家 APP 不断地进行清理优化 ,才感觉运行速度稍微提高了点,就算手机在各种性能跑分软件面前分数遥遥领先,还是感觉无论有多大的内存空间都远远不够用.相信每个使用 Android 系统的用户都有过以上类似经历,确实,Android

  • Android图片性能优化详解

    1. 图片的格式 目前移动端Android平台原生支持的图片格式主要有:JPEG.PNG.GIF.BMP.和WebP(自从Android 4.0开始支持),但是在Android应用开发中能够使用的编解码格式只有三种:JPEG.PNG.WebP,图片格式可以通过查看Bitmap类的CompressFormat枚举值来确定. public static enum CompressFormat { JPEG. PNG. WebP; private CompressFormat() { } } 如果要在

  • 浅谈android性能优化之启动过程(冷启动和热启动)

    本文介绍了浅谈android性能优化之启动过程(冷启动和热启动) ,分享给大家,具体如下: 一.应用的启动方式 通常来说,启动方式分为两种:冷启动和热启动. 1.冷启动:当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动. 2.热启动:当启动应用时,后台已有该应用的进程(例:按back键.home键,应用虽然会退出,但是该应用的进程是依然会保留在后台,可进入任务列表查看),所以在已有进程的情况下,这种启动会从已有的进程中来启动应用,这个方式叫热

  • Android性能优化之利用强大的LeakCanary检测内存泄漏及解决办法

    前言: 最近公司C轮融资成功了,移动团队准备扩大一下,需要招聘Android开发工程师,陆陆续续面试了几位Android应聘者,面试过程中聊到性能优化中如何避免内存泄漏问题时,很少有人全面的回答上来.所以决定抽空学习总结一下这方面的知识,以及分享一下我们是如何检测内存泄漏的.我们公司使用开源框架LeakCanary来检测内存泄漏. 什么是内存泄漏? 有些对象只有有限的生命周期.当它们的任务完成之后,它们将被垃圾回收.如果在对象的生命周期本该结束的时候,这个对象还被一系列的引用,这就会导致内存泄漏

  • Android ListView列表控件的介绍和性能优化

    ListView列表控件 一.ListView显示数据的原理:mvc模式 m:mode 数据(用javabean规范封装) v:view ListView c:adapter 适配器,负责把数据展示到ListView上 二.ListView最常用适配器 BaseAdapter.SimpleAdapter.ArrayAdapter 三.ListView显示数据的步骤 1.创建ListView 2.自定义ListView的适配器继承BaseAdapter,重写baseAdapter的getCount

  • Android TraceView和Lint使用详解及性能优化

    Android lint工具是Android studio中集成的一个代码提示工具,它主要负责对你的代码进行优化提示,包括xml和java文件,很强大.编写完代码及时进行lint测试,会让我们的代码变得非常规范而且避免代码冗余.让我们及时发现代码中隐藏的问题. lint的使用时非常简单的,我看可以用它实现代码布局的优化,Java代码的优化,不过我觉得根本解决问题还是得依赖于开发者的素质. 例子:我们需要删除掉一些无用的变量和布局文件等,这对代码的冗余有很大的帮助. 代码提示我们在6行需要为Ima

随机推荐