android 提升性能总结

有一些蛮有用的技巧值得收藏和分享

转载自:http://blog.csdn.net/hgl868/article/details/7623852


出色的用户体验有三个特征:速度快、响应及时以及无缝。下面的信息帮助你的应用如何能够在Android上实现这些特征。

一、速度快

你不能假设手机与桌面系统和服务器一样提速,更多的是你要关注你的代码是否高效。

编写高效的Android代码,应遵循两个原则:

不要做不必要的事

不要分配不必要的内存

以下是一些达到此目标的小技巧(有一些技巧是与oo的原则冲突,斟酌使用场景):

1、避免建立对象

例如,int数组比Integer数组好,同理,这适用于所有基本类型的组合

2、使用本地方法

不要吝惜使用String.indexOf(), String.lastIndexOf()等特殊实现的方法(specialtymethods)。这些方法都是使用C/C++实现的

3、使用实现类比接口好

Map myMap1 = new HashMap();

HashMap myMap2 = new HashMap();

调用一个接口的引用会比调用实体类的引用多花费一倍的时间

4、不用getter和setter

应该直接访问变量

5、将成员变量缓存到本地

for (int i = 0; i< this.mCount; i++)           

    dumpItem(this.mItems[i]);

最好改成这样:

  int count = this.mCount;

  Item[] items = this.mItems;

  for (int i = 0; i< count; i++)dumpItems(items[i]);

另外,永远不要在for的第二个条件中调用任何方法

6、给常量加上final

static int intVal = 42;

static String strVal = “Hello, world!”;

  编译器会生成一个叫做的初始化类的方法,当类第一次被使用的时候这个方法会被执行。方法会将42赋给intVal,然后把一个指向类中常量表的引用赋给strVal。当以后要用到这些值的时候,会在成员变量表中查找到他们。

static final int intVal = 42;

static final String strVal = “Hello, world!”;

  现在,类不再需要方法,因为在成员变量初始化的时候,会将常量直接保存到类文件中。用到intVal的代码被直接替换成42,而使用strVal的会指向一个字符串常量,而不是使用成员变量。

7、谨慎使用foreach

  foreach可以用在实现了Iterable接口的集合类型上。foreach会给这些对象分配一个iterator,然后调用hasNext()和next()方法。你最好使用foreach处理ArrayList对象,但是对其他集合对象,foreach相当于使用 iterator

8、避免使用枚举

  枚举变量非常方便,但不幸的是它会牺牲执行的速度和并大幅增加文件体积

9、将内部类需要访问的外部变量或方法声明在包范围内

public class Foo {

  private int mValue;

  public void run() {

      Inner in = newInner();

      mValue = 27;

      in.stuff();

  }

  private class Inner {

      void stuff() {

     System.out.println(Foo.this.mValue);

      }

  }

}

Foo$Inner是一个完全独立的类,它要直接访问Foo的私有成员是非法的。编译器会自动生成一个方法:

static int Foo.access$100(Foo foo) {

  return foo.mValue;

}

内部类在每次访问”mValue”方法时,都会调用这个静态方法。同理,内部类要访问私有方法也是如此。

10、避免使用浮点数

嵌入式处理器通常没有支持浮点运算的硬件,所有对”float”和”double”的运算都是通过软件实现的

通过将内部类访问的变量和函数声明由私有范围改为包范围,我们可以避免这个问题。这样做可以让代码运行更快,并且避免产生额外的静态方法。(遗憾的是,这些成员变量和方法可以被同一个包内的其他类直接访问,这与经典的OO原则相违背。因此当你设计的时候应该谨慎使用这条优化原则)

二、响应及时

1、将耗时工作交到子线程

2、如果你的程序在后台处理用户的输入,给出一个你正在工作的提示(ProgressBar(进度条)和ProgressDialog(进度对话框)是很好的选择)

3、如果是游戏,把计算步骤放在子线程中

三、无缝

1、不要丢失数据,继承onPause()方法

2、利用ContentProvider来共享数据

3、不要打断用户,使用通知

随着手机平台的发展和所提供应用的提升,质量成为应用成功的最重要因素。如果那些应用无法提供强大的功能和稳定的用户体验,那就会很快被用户卸载。开发者需要记住的是,虽然Android智能手机和平板电脑的速度日益提升,但其应用仍然运行在资源有限的环境中,其电池及处理器性能与最新的台式电脑、手提电脑仍存在差距。以下是某些优化应用运行效果的方法:
我们先来阐述某些让应用反应灵敏的编程技巧。

技巧1:从优秀的编程开始

要采用已为用户所接受的运算法则和标准的设计样式,这些被人们长期使用的编程法则也同样适用于Android应用,尤其当这些应用使用内在设备服务时。
比如,假设你编写的应用需要以地理定位服务为基础。只需要在必要时开始注册进行位置更新,在无需更新信息时,确保应用停止更新进程。这会帮助节省设备的电量和系统处理器的负担。

技巧2:保持应用的灵活性
通过使用AsyncTask、IntentService或自定义背景服务来保持应用的灵活性。使用加载器来简化加载时间较长数据的状态管理,比如光标。不可让应用在其他进程进行时显得缓慢或完全静止。
如果某些操作需要一定的时间和资源,应当将这个进程单独分离出来异步处理,这样你的应用才能够保持流畅的运行。可以运用这种方法的操作包括:磁盘读写,访问内容供应方、数据库和网络,其他需要较长时间的任务。

技巧3:使用最新的Android SDK版本和API
保持应用的更新,使用Android平台提供的最新内容。随着Android平台的发展,它也在逐步改善中。某些功能被移除,或者替换成更好的选项。其核心API中的漏洞已修复,整个API性能已得到提升。该平台已引入装载器之类的新API,帮助开发者编写更为稳定和反应灵敏的应用。
Android3.0应用支持硬件加速,你可以加以应用。应当理解的是,最佳的表现情况会随着时间逐渐改变。睿智的开发者会更新平台发布的最新内容和API

技巧4:检查Strict Mode
你可以使用称为“StrictMode”的Android API来查找编程中的问题。StrictMode会帮助你识别应用是否正在耗费内存,也可以帮你检查应用是否正在尝试开展漫长的模块化操作。
StrictMode类(注:即android.os.StrictMode)与Android 2.3同期发布。

技巧5:在发布之前停用或最小化调试和诊断
你在Android应用的开发中可能会将某些调试代码构建其中。在应用发布之前确保这些功能被最小化或完全停用。
接下来,让我们来讨论如何用优秀的用户界面设计原则让你的应用加载速度更快。

技巧6:保持布局简洁自然
简洁自然的布局会加快加载速度。不要让屏幕布局中充斥过多不必要的内容。花点时间开发用户可以有效使用的简洁用户界面,不要将过多的功能性内容塞入单个屏幕中。这不仅对应用表现有帮助,而且会帮助用户更有效地使用应用。
分割内容可以帮助划分用户界面功能性,同时不牺牲应用在各种不同设备上的灵活性。

技巧7:根据目标设备调整应用资源
根据特定的设备配置来调整资源,这样它们就能够有效地加载。在图像资源方面,这个显得尤为重要。如果你的应用中有大型的图片资源需要加载,那么要做好调整。
另一个技巧是,当以许多种设备为目标时,保持应用包文件大小合适,只需要在其中包含应用运行所需的核心资源即可,然后让用户根据具体设备下载应用其他内容。

技巧8:使用Hierarchy Viewer工具
HierarchyViewer工具可以帮助你解除应用布局中的漏洞。它还提供了许多有价值的信息,比如每个View控制需要多长的时间。找到问题所属领域,这样解决问题会更加简单。

技巧9:使用layoutopt工具
layoutopt工具是个简单的命令行工具,可以帮助你识别不必要的控制和其他让你布局资源崩溃的事项,提升其性能。它可以帮助你找到不必要的多余布局控制。较少和较浅布局可优化应用运行性能。
最后,在自认为应用达到最好状况时,对其进行测试。

技巧10:使用Traceview和其他Android应用压缩工具
AndroidSDK中有许多可以压缩应用的工具。可能最流行的工具就是Traceview,这个图像工具可以帮助你调试和找到应用的性能问题。

结语
目前有许多方法可以让你的Android
应用运行加速。有些涉及到使用某种具体的运算法则,其他依靠某些真正的调试和运行监管技术。Android平台中有许多种免费的工具可以用来帮助跟踪和调整应用中的表现问题。

 

什么是TraceView?先看下百度出来的解释吧:

Traceviewandroid平台配备一个很好的性能分析的工具。它可以通过图形化的方式让我们了解我们要跟踪的程序的性能,并且能具体到method

  关于Traceview的使用

  首先,必须在程序当中加入代码,以便生成trace文件,有了这个trace文件才可以将其转化为图形。

  要添加的代码如下:

Java代码

// starttracing to "/sdcard/yourActivityTrace.trace"

Debug.startMethodTracing("yourActivityTrace");

   // ...// stop tracing Debug.stopMethodTracing();

  // starttracing to "/sdcard/yourActivityTrace.trace"Debug.startMethodTracing("yourActivityTrace");

  // ...// stop tracing Debug.stopMethodTracing();

Google DevGuide当中说可以在activityonCreate()中添加Debug.startMethodTracing(),而在onDestroy()中添加Debug.stopMethodTracing(),但是在实际的测试时发现这种方式其实并不好用,因为通常情况下我们的activityonDestroy()是由系统决定何时调用的,因此可能等了很长时间都不会得到这个trace文件。因此决定在onStop()中来调用Debug.stopMethodTracing()。这样当我们切换到其它activity或者点击home键的时候onStop()就会被调用,我们也就可以得到完整的trace file

  在运行程序之前,首先要保证我们的AVD是一个带有SD cardAVD,这样才能使trace文件保存到/sdcard/...当中。运行后可以任意做一些操作,然后点击home键。这是通过DDMS file explore就可以看到/sdcard/目录下有一个trace文件,现在把这个文件copy到电脑上指定的目录,假设是C:/tracefile目录下。

  可以通过命令行来执行traceview,进入tools目录后,执行

traceviewC:/tracefile/yourActivityTrace.trace

  之后就可以看到图形了,接下来就是按照Google DevGuide中的解释去分析图形就OK了。

下面来看如何实现以及需要注意的地方:

 实现的步骤分为三步:1.必须先在我们的模拟器中创建sdCard2.将我们的调试代码嵌入工程;3.利用TraceView来观察和分析代码情况;

1.对于创建模拟器的sdCard这里写出两种方式:

第一种:我们在eclipse中创建avd的时候的时候在选择api下面有个 Sd Card 的选项,第一项填入创建sdcard的大小即可。

第二种:cmd命令!打开cmd并且cdandroid sdk tool路径下;(或者在环境变量Path中将sdk tool路径配置上,然后重新打开cmd

使用mksdcard -l mycard 1024MF:/mysdcard.img 创建了一个1Gsdcard

使用emulator -avd my_android-sdcard F:/mysdcard.img 激活sdcard!

最后在eclipsePreferences-->Android-->Launch加入-sdcard F:/mysdcard.img (此步骤就是在第一种创建方式中添加sdcard的支持)

备注1

    如果sdcard分配的空间太小,则程序追踪文件就一直记录到sd储蓄卡容量慢为止,所以调试前,要为程序生成一个适当的SD存储卡也较为重要,因为程序运行时间越长,这个追踪文件也就越大。

备注2;

(如果第二种创建方式中的第二部激活出现 emulator:ERROR: the user data image is used by another emulator. aborting,请关闭模拟器,或者进入目录:/Documents and Settings /用户 / .android/AVD / *设备* / (比如我的目录是:C:/Documents andSettings/Administrator/.android/avd/android2.0.avd)

然后删去以.lock结尾的文件夹就行(我简单解释下为什么要删除这些文件呢,其实.lock是加锁,如果程序崩溃等原因导致无法清除这些以.lock结尾的文件夹,就会出现这个问题,也就是这个avd的锁没有被释放,导致avdmanager以为这个avd正在使用当中。))

2.将我们的调试代码嵌入工程

 正如我们百度到的说明一样,在程序运行的开端加上Debug.startMethodTracing("yourActivityTrace"); 然后在onPause()中调用Debug.stopMethodTracing();为什么要将结束写在onPause()中而不写在onStop(),那么如果你去看api的话,你会看到,Api中介绍onPause()会在你返回和点击home按键后触发,而onStop()一般是由系统来触发,当该程序处于后台的时候,而且当内存紧张的时候,可能会调用,但是可能永远不会调用到!

备注:要记住当把调试代码加入项目中以后不要立即运行项目,而是必须在AndroidMainfest.xml中定义一条"写入SD卡的权限"那么添加权限的代码如下:

   

因为咱们的调试代码会在SD卡中生成一个追踪文件,也就是往SD卡中写入了数据,所以需要声明一条权限。这里必须注意哦!

[java:showcolumns]

 

·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150

       

根据引用的内容,这段引用中包含了一些Vue.js代码和HTML代码,并讨论了换行符和空格在网页中的使用。其中,引用是关于添加和还原换行符的方法,引用是关于在编辑数据时获取详情和使用textarea的示例代码,引用是关于HTML中空格的处理和字符实体的使用。 问题中提到的&nbsp;是HTML中表示空格的字符实体。HTML通常会自动截取多余的空格,不管你加多少空格,都被看做一个空格。为了在网页中增加空格,可以使用&nbsp;表示空格。此外,还有其他常用的字符实体,如<表示小于号,>表示大于号,&表示&符号,"表示双引号,等等。 需要注意的是,引用的内容中有一些HTML实体被转义了,所以在描述字符实体时需要参考编码转义后的字符。 根据给定的引用内容,我无法直接回答问题,因为问题中的信息不完整。请提供更具体的问题或补充说明,我将尽力为您提供帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [js+v-html+正则表达式去除所有& nbsp和html标签(& nbsp 换行 )](https://blog.csdn.net/xm_w_xm/article/details/91992754)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [html&nbsp;&nbsp;特殊字符(转)](https://blog.csdn.net/feiniu5566/article/details/13624619)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值