小伙伴关心的问题:android的性能优化,android性能优化简书,本文通过数据整理汇集了android的性能优化,android性能优化简书相关信息,下面一起看看。

android的性能优化,android性能优化简书

每日推荐

具体文章详情地址:

http://mp.weixin.qq.com/s?__biz=MzIyMDY0NzI5OQ==&mid=2247483696&idx=1&sn=948008704a40cfa8800625ed94ce4115&chk *** =97c99bdca0be12cad3245dcb7f3a2c71c722fa9647e5e4a602bab12594eeff5fad247749b74b#rd

一款优雅的遵循 Material Design 的开源音乐播放器,UI参考 腾讯轻听 音乐播放器,使用 Lastfm Api 与 酷狗歌词Api。项目架构采用 mvp-clean,基于 Retrofit2 + Dagger2 + RxJava + RxBus + Glide。

项目地址:

https://github.com/huihui4045/Android_MusicPlayer

1概述

Android设备作为一种移动设备,不管是内存还是cpu的性能都受到了一定的限制,无法做到像PC设备那样具有超大的内存和高性能的cpu.鉴于这一点,这也意味着Android程序不可能无限制地使用内存和cpu资源,过多地使用内存会导致程序内存溢出,即OOM.而过多地使用CPU资源,一般是指做大量的耗时任务,会导致手机变得卡顿甚至出现程序无法响应的情况,即ANR.由此来看,Andrad工程序的性能问题就变得异常突出了,这对开发人员也提出了更高的要求。为了提高应用程序的性能,本文介绍了一些有效的性能优化方法,主要内容包括布局优化、绘制优化、内存泄露优化、响应速度优化、Listview优化、Bitmap优化、线程优化以及一些性能优化建议,同时在介绍响应速度优化的同时还介绍了ANR日志的分析方法。

性能优化中一个很重要的问题就是内存泄露,内存泄露并不会导致程序功能异常,但是它会导致Android工程序的内存占用过大,这将提高内存溢出的发生几率。如何避免写出内存泄露的代码,这和开发人员的水平和意识有很大关系,甚至很多情况下内存泄露的原因很难被直接发现,这个时候就需要借助一些内存泄漏分析工具,本文将介绍内存泄漏分析工具MAT的用法。

本节介绍了一些有效的性能优化方法,主要内容包括布局优化、绘制优化内存泄漏优化、响应速度优化、Listview优化、Bitmap优化、线程优化、电池优化以及一些性能优化建议,在介绍响应速度优化的同时还介绍了ANR日志的分析方法。

2布局优化

如何进行布局优化昵?首先删除布局中无用的控件和层级,其次有选择地使用性能较低的ViewGrow,比如ReJativeLayout。如果布局中既可以使用LinearLayout,也可以使用,RelativeLayour,那么就采用LinearLayout,这是因为RelativeLayout的功能比较复杂,它布局过程需要花费更多的cpu时间Frame Layout和LinearLayout二样都是一种简单高效的ViewGroup,因此可以考虑使用它们,但是很多时候单纯通过一个LinearLayout或者FrameLayout无法实现产品效果,需要通过嵌套的方式来完成。这种情况下还是建议采用RelativeLayout,因为ViewGroup的嵌套就相当于增加了布局的层级,同样会降低性能。

布局优化的另一种手段是采用<include>标签、<merge>标签和ViewStub。<include>主要用于布局重用,<merge>标签一般配合<include>配合使用,他可以降低布局的层级,而ViewStub则提供了按需加载的功能,当需要时才把ViewStub中的布局加载到内存中,提高了程序初始化的效率。

<include>标签

<include>标签可以将一个指定的布局文件加载到当前布局文件中,如下图所示。

上面的代码中,@layout/titlle指定了另外一个布局文件,通过这种方式就不用把

titlebar这个布局文件的内容再重复写一遍了,这就是<include>的好处。<include>标签只支持以android:layout-开头的属性,比如android:layou_width、android:layout_height,其他属性是不支持的,比如android:background。当然,android:id这个属性是个特例,如果<include>标签指定了这个id属性,同时被包含的布局文件的根元素也指定了id属性,那么以<include>标签指定的id属性为准。需要注意的是,如果<include>标签指定了android:layout_*这种属性,那么要求android:layout_width和androidlayou--height必须存在,否则其他androidlayout_*形式的属性无法生效,上面的new_title布局是一个指定了android:layout_*属性的示例。

<merge>标签的使用

<merge>标签一般和<include>标签一起使用从而减少布局的层级,,在上面的示例中,由于当前布局是一个竖直方向的LinearLayout,这个时候如果被包含的布局文件中也采用了竖直方向的LinearLayout,那么显然被包含的布局文件中的LinearLayout址多余的,通过<merge>签就可以去掉多余的那一层LinearLayout,如下所示。

ViewStub

Viewstub继承了View,它非常轻量级且宽/高都是0,因此它本身不参与任何的布局和绘制过程。Viewstub的意义在于按需加载所需的布局文件,在实际开发中,有很多布局件在正常情况下不会显示,比如网络异常时的界面,这个时候就没有必要在整个界面初始化的时候将其加载进来,通过Viewstub就可以做到在使用的时候再加载,提高了程序初始化时的性能。下面是一个Viewstub的示例。

<ViewStubandroid:id="@+id/view_stub"android:layout_width="match_parent"android:layout_height="wrap_content"android:inflatedId="@id/title_bar"android:layout="@layout/titlebar"/>

其 中 view_stub 是 Viewstub 的 id, 而 title_bar是layout/titlebar 。布局的根元素的id。如何做到按需加载呢?在需要加载Viewstub中的布局时,可以按照以下两种方法:

((ViewStub)findViewById(R.id.view_stub)).setVisibility(View.VISIBLE);Viewinflate=((ViewStub)findViewById(R.id.view_stub)).inflate();

viewstub inflate方法的内部源码如下图:

当ViewStub通过setVisibility或者inflate方法加载后,ViewStub就会被他内部的布局替换掉,这个时候ViewStub就不再是整个布局的一部分了,从上图的内部源码,我们可以看出ViewStub已经通过parent.removeViewInLayout方法去掉了,然后再把view 添加在这个位置的。所以,基于这个原理,ViewStub是不支持<merge>标签的。

3绘制优化

下文将重点介绍Android 性能优化的绘制优化。敬请继续关注。

更多android的性能优化,android性能优化简书相关信息请关注本站,本文仅仅做为展示!