• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Android性能优化的浅谈,android性能优化

Android性能优化的浅谈,android性能优化

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了android性能优化,android性能优化典范,android app性能优化,android应用性能优化,android中性能优化等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

Android性能优化的浅谈,android性能优化


一、概要:

    本文主要以Android的渲染机制、UI优化、多线程的处理、缓存处理、电量优化以及代码规范等几方面来简述Android的性能优化

 

二、渲染机制的优化:

    大多数用户感知到的卡顿等性能问题的最主要根源都是因为渲染性能。

    Android系统每隔16ms发出VSYNC信号,触发对UI进行渲染, 如果每次渲染都成功,这样就能够达到流畅的画面所需要的60fps,为了能够实现60fps,这意味着程序的大多数操作都必须在16ms内完成。

    

    如果你的某个操作花费时间是24ms,系统在得到VSYNC信号的时候就无法进行正常渲染,这样就发生了丢帧现象。那么用户在32ms内看到的会是同一帧画面。

    

    Probably:也许是因为你的layout太过复杂,无法在16ms内完成渲染,有可能是因为你的UI上有层叠太多的绘制单元,还有可能是因为动画执行 的次数过多。这些都会导致CPU或者GPU负载过重。

    Resolved:我们可以通过一些工具来定位问题,比如可以使用HierarchyViewer来查找Activity中的布局是否过于复杂,也可以使用手机设置里 面的开发者选项,打开Show GPU Overdraw等选项进行观察。

          你还可以使用TraceView来观察CPU的执行情况,更加快捷的找到性能瓶颈。

    

    浅谈Overdraw(过度绘制):

      Overdraw(过度绘制)描述的是屏幕上的某个像素在同一帧的时间内被绘制了多次。在多层次的UI结构里面,如果不可见的UI也在做绘制的操作,这就会导致某些像素区域被绘制了多次。这就浪费大量的CPU以及GPU资源。 

      

      Tips:我们可以通过手机设置里面的开发者选项,打开Show GPU Overdraw的选项,可以观察UI上的Overdraw情况

      

      图解:蓝色,淡绿,淡红,深红代表了4种不同程度的Overdraw情况,我们的目标就是尽量减少红色Overdraw,看到更多的蓝色区域。

      Tips:Overdraw有时候是因为你的UI布局存在大量重叠的部分,还有的时候是因为非必须的重叠背景。例如某个Activity有一个背景,然后里面 的Layout又有自己的背景,同时子View又分别有自己的背景。

      仅仅是通过移除非必须的背景图片,这就能够减少大量的红色Overdraw区域,增加 蓝色区域的占比。这一措施能够显著提升程序性能。

 

      注意:如需获取更多渲染机制的内容,请移步 https://www.oschina.net/news/60157/android-performance-patterns

 

三、UI方面的优化:

     1)首先简单谈谈view的绘制流程:measure - layout - draw

     

      ps:具体的流程网上一搜一大把+_+

     2)子控件越多,绘制的时间也就越长。

      对于Listview或者GridView这种多item的组件来说,复用item可以减少inflate次数,通过setTag,getTag的ViewHolder方式实现复用,这里要注意的是,holder中的控件最好reset后再赋值,避免图片,文字错乱。

      *以下简单的例子:(尽量使用注解,有很多注解的开源框架可以使用:butterKnife, AndroidAnnotation, Dragger2)

 1 static class ViewHolder{
 2     @InjectView(R.id.imageView1)
 3     ImageView imageView1;
 4     @InjectView (R.id.text1)
 5     TextView textView1;
 6 }
 7 
 8 @Override
 9 public View getView(int position, View convertView, ViewGroup parent) {
10     ViewHolder holder;
11              
12     if(convertView == null){
13        holder = new ViewHolder();
14        convertView = LayoutInflater.from(mContext).inflate(R.layout.listview_item, null);
15        convertView.setTag(holder);
16      }else{
17          holder = (ViewHolder)convertView.getTag();
18      }
19              
20          holder.imageView1.setImageResource(R.drawable.ic_launcher);
21          holder.textView1.setText(mData.get(position));  
22              
23          return convertView;
24 }

    3)UI ReView(视图的检查) 

      1. 减少视图层级可以有效的减少内存消耗,因为视图是一个树形结构,每次刷新和渲染都会遍历一次。

      2. 想要减少视图层级首先就需要知道视图层级,所以下面介绍一个SDK中自带的一个非常好用的工具hierarchyviewer。你可以在下面的地址找到它:your sdk path\sdk\tools

      

      3. 如上图大家可以看到,hierarchyviewer可以非常清楚的看到当前视图的层级结构,并且可以查看视图的执行效率(视图上的小圆点,绿色表示流畅,黄色和红色次之),所以我们可以很方便的查看哪些view可能会影响我们的性能从而去进一步优化它。

       hierarchyviewer还提供另外一种列表式的查看方式,可以查看详细的屏幕画面,具体到像素级别的问题都可以通过它发现。

       

      4)一些标签的使用

      <merge> :它在优化UI结构时起到很重要的作用。目的是通过删减多余或者额外的层级,从而优化整个Android Layout的结构,优化布局层数。

      <include > :可以通过这个标签直接加载外部的xml到当前结构中,是复用UI资源的常用标签,来共享布局。

      <ViewStub> : 动态加载view,此标签可以使UI在特殊情况下,直观效果类似于设置View的不可见性,但是其更大的意义在于被这个标签所包裹的Views在默认状态下不会占用任何内存空间。

 

四、多线程的处理:

   1. Android 提供的多种多线程工具类 (AsyncTask, HandlerThread, IntentService, ThreadPool),许多操作都需要由 主线程(UI 线程)来执行,比如:

      

      2. Android 系统的屏幕刷新频率为 60 fps, 也就是每隔 16 ms 刷新一次。如果在某次绘制过程中,我们的操作不能在 16 ms 内完成,那它则不能赶上这次的绘制公交车,只能等下一轮。

       这种现象叫做 “掉帧”,用户看到的就是界面绘制不连续、卡顿。

      

      3. HandlerThread 就是MessageQueue,Looper和 Handler 的组合。每个应用启动时,系统会创建一个该应用的进程以及主线程,这里的主线程就是一个 HandlerThread。

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Android性能优化的浅谈,android性能优化
  • Android高性能ORM数据库DBFlow入门,ormdbflow

相关文章

  • 2017-05-228.3.9 Paint API之—— ColorFilter(颜色过滤器)(1/3)
  • 2017-05-26win7系统连接WiFi上网信号很弱怎么办
  • 2017-05-26fastdfs 使用遇到的问题
  • 2017-05-26Android SDK在线更新镜像服务器,androidsdk
  • 2017-05-26BroadcastReceiver--Android广播机制,broadcastreceiver
  • 2017-05-26菜鸟新闻2--设置沉浸式状态栏,新闻2--沉浸状态栏
  • 2017-05-26ubuntu下安装AndroidStudio
  • 2017-05-26Android 中的长度单位详解
  • 2017-05-26Android 实现闪屏页和右上角的倒计时跳转,android跳转
  • 2017-05-26ListView嵌套出现的问题,listview嵌套出现

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 转载:android MVC设计模式,androidmvc
    • Android性能优化之Bitmap的内存优化
    • 『原创』手把手教你搭建一个实用的油耗App(一),油耗app
    • Linux内核系列—操作系统开发之进入32位保护模式,linux保护模式
    • Android事件分发机制总结
    • QQ互联登录以及非官方正版应用报100044错误,互联100044
    • 大神都是有个起点的,大神都是起点
    • hellocharts-android-Android图表开源库的使用(一)
    • 热修复,android热修复
    • Apache Cordova开发Android应用程序——番外篇,cordovaandroid

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有