编写高效的Android代码
// 300) {
text = text + “\r\n\n本文来自CSDN博客,转载请标明出处:” + location.href;
clipboardData.setData(”text”, text);
}
}, 100);
}
}
// ]]> //
虽然如此说,但似乎并没有什么好的办法:Android设备是嵌入式设备。现代的手持设备,与其说是电话,更像一台拿在手中的电脑。但是,即使是“最快”的手持设备,其性能也赶不上一台普通的台式电脑。
这就是为什么我们在书写Android应用程序的时候要格外关注效率。这些设备并没有那么快,并且受电池电量的制约。这意味着,设备没有更多的能力,我们必须把程序写的尽量有效。
本章讨论了很多能让开发者使他们的程序运行更有效的方法,遵照这些方法,你可以使你的程序发挥最大的效力。
简介
对于占用资源的系统,有两条基本原则:
不要做不必要的事
不要分配不必要的内存
所有下面的内容都遵照这两个原则。
有些人可能马上会跳出来,把本节的大部分内容归于“草率的优化”(xing:参见[The Root of All Evil]), 不可否认微优化(micro-optimization。xing:代码优化,相对于结构优化)的确会带来很多问题,诸如无法使用更有效的数据结构和算 法。但是在手持设备上,你别无选择。假如你认为Android虚拟机的性能与台式机相当,你的程序很有可能一开始就占用了系统的全部内存(xing:内存 很小),这会让你的程序慢得像蜗牛一样,更遑论做其他的操作了。
Android的成功依赖于你的程序提供的用户体验。而这种用户体验,部分依赖于你的程序是响应快速而灵活的,还是响应缓慢而僵化的。因 为所有的程序都运行在同一个设备之上,都在一起,这就如果在同一条路上行驶的汽车。而这篇文档就相当于你在取得驾照之前必须要学习的交通规则。如果大家都 按照这些规则去做,驾驶就会很顺畅,但是如果你不这样做,你可能会车毁人亡。这就是为什么这些原则十分重要。
当我们开门见山、直击主题之前,还必须要提醒大家一点:不管VM是否支持实时(JIT)编译器(xing:它允许实时地将Java解释型 程序自动编译成本机机器语言,以使程序执行的速度更快。有些JVM包含JIT编译器。),下面提到的这些原则都是成立的。假如我们有目标完全相同的两个方 法,在解释执行时foo()比bar()快,那么编译之后,foo()依然会比bar()快。所以不要寄希望于编译器可以拯救你的程序。
避免建立对象
世界上没有免费的对象。虽然GC为每个线程都建立了临时对象池,可以使创建对象的代价变得小一些,但是分配内存永远都比不分配内存的代价大。
如果你在用户界面循环中分配对象内存,就会引发周期性的垃圾回收,用户就会觉得界面像打嗝一样一顿一顿的。
所以,除非必要,应尽量避免尽力对象的实例。下面的例子将帮助你理解这条原则:
当你从用户输入的数据中截取一段字符串时,尽量使用substring函数取得原始数据的一个子串,而不是为子串另外建立一份拷贝。这样你就有一个新的String对象,它与原始数据共享一个char数组。
如果你有一个函数返回一个String对象,而你确切的知道这个字符串会被附加到一个StringBuffer,那么,请改变这个函数的参数和实现方式,直接把结果附加到StringBuffer中,而不要再建立一个短命的临时对象。
一个更极端的例子是,把多维数组分成多个一维数组。
int数组比Integer数组好,这也概括了一个基本事实,两个平行的int数组比(int,int)对象数组性能要好很多。同理,这试用于所有基本类型的组合。
如果你想用一种容器存储(Foo,Bar)元组,尝试使用两个单独的Foo[]数组和Bar[]数组,一定比(Foo,Bar)数组效 率更高。(也有例外的情况,就是当你建立一个API,让别人调用它的时候。这时候你要注重对API借口的设计而牺牲一点儿速度。当然在API的内部,你仍 要尽可能的提高代码的效率)
总体来说,就是避免创建短命的临时对象。减少对象的创建就能减少垃圾收集,进而减少对用户体验的影响。
使用本地方法
当你在处理字串的时候,不要吝惜使用String.indexOf(), String.lastIndexOf()等特殊实现的方法(specialty methods)。这些方法都是使用C/C++实现的,比起Java循环快10到100倍。
使用实类比接口好
假设你有一个HashMap对象,你可以将它声明为HashMap或者Map:
Map myMap1 = new [...]
大家在学习Google手 机平台Android的过程中,经常在安装ADT的时候遇到“requires plug-in org.eclipse.wst.sse.ui”的提示,使得“Android Editors”不能得以顺利安装。查看了一下Google提供的文档,其中有一种简易的方法如下:
1.点击Eclipse的 Help菜单,选择software updates >> Find and Install…>>search for new features to install。打开Update Sites to Visit窗口。
2.选择 Android Plugin 和 Europa discovery site,然后按“Finish”按钮继续。
3.在Seach Result窗口中,点选Android Plugin,此时会在窗体的顶部出现错误提示 “requires plug-in org.eclipse.wst.sse.ui”。
4.Europa discovery site那个CheckBox不要选择,然后点击窗体右部的“Selected Required”按钮,Eclipse将自动寻找其他所需组件,并自己予以选择。
5.点击“Next”按钮,出现License窗体,选择接受,按Next进行后续安装,根据自己网络速度的不同,可能需要一段时间,就安心地等待吧(不再赘述)。
整个 2007 年的 9 月,我都把时间花在了撰写《 从 Java EE 到 Java ME 的通讯 》这篇文章上。其实这并不是对 2 年前的项目进行整理并 post 出来而已,这完全不是主要目的!!!
看 官们完全没有理解我的用意,我得到的全是“文章转载”这样的留言回复!那篇文章的感言我这样写的:“要实现遐想并解释上面的问题有待于广大开发者的共同努 力,把自己的业余时间都投入在类似 db4oME 这样的技术上,如果这样的分布式数据库能成功实现,我想这会给移动计算带来一场革命,更多依托网络、数据库的手机应用程序将会诞生,发挥 Java 强大的优势!”
我是 2007 年 11 月底得知 Android 的,正好对应了上面的感言!不知道国人是怎么想的,难道做手机应用程序没有做手机游戏有前途,还是无话可说只能对我的感言嗤之以鼻?如果是这样,那么看了本文之后也许会让你如梦初觉 ……
为 手机 设备而生的 Android软件开发集合包 已经 发布了一周 。作为 db4o对象数据库 创始人的我来讲,这是我们的产品和公司最值得兴奋的事件之一。
Android 将把零散的手机开发平台统一起来,而且它可以开发基于位置的应用程序来服务全世界的用户。这就是为什么会掀起一场手机领域狂风的原因。
内容
(略,参考下面详细标题。)
这场狂风的前景
从 全球化观点来看,手机操作系统是非常之零碎的。手机制造商和运营商这些关键角色,他们都有自己的一套私有技术。被认为是全球性的如 Symbian ,微软和 Apple 都显得较小了,他们每年分别为全球提供 60million 、 20million 以及计划的 10million 部手机。
由于没有标准的操作系统,运营商倾向于使写出的应用程序能让普通浏览器以 Ajax ( Javascript )方式运行。在手机上面运行 Ajax [...]
要玩google 手机 G1的模拟器,当然需要先去google上面下载Android的SDK,解压出来后在SDK的根目录下有一个tools文件夹,里面就是模拟器和一些非常有用的工具。
双击“emulator.exe”,直接启动模拟器,简单吧。当然,如果要对模拟器进行一些定制,还是要从命令行调用,带上参数启动。下面就来介绍一下启动是常用的几个参数:
1.模拟器外观的定制:
480×320, landscape: emulator -skin HVGA-L
320×480, portrait : emulator -skin HVGA-P (default)
320×240, landscape: emulator -skin QVGA-L
240×320, portrait : emulator -skin QVGA-P
2.为模拟器加上SD卡:
emulator -sdcard D:\sdcard.img
下面我们再来说说如何创建”sdcard.img”文件:
“tools”目录下还有另外一个很好用的工具“mksdcard.exe”,一看名字就知道——make sdcard。对,就用它来创建一个“SD卡”。
命令为:
mksdcard 1024M D:\sdcard.img
OK,这样一个容量为1G的SD卡就创建完毕了。
使用SDCard:
创建: mksdcard <1024M> <sdcard.img>
(bytes(default),K,M)
连接到模拟器: emulator -sdcard <目录/sdcard.img>
传文件到SDCard: adb push <目录/audio.mp3> </sdcard/audio.mp3>
玩过手机模拟器的人一般最感兴趣的当然是模拟器能做什么呢?下面一一道来:
GPhone的模拟器有个特有的号码:15555218135,这个就类似我们实体手机的SIM卡号码啦。要实现拨号,用手机?当然不行!
更简单,三步:
1.运行 cmd
2.连接: telnet localhost 5554
3.命令:gsm call 15555218135
look!是不是模拟器上显示来电了?接听/挂断和实体手机一样。
发短信也一样简单,重复上面1,2两步,第三部命令改一下:
sms send 15555218135 Hello,this is a Message.
来说说PC与模拟器文件传输的方法吧。这里需要用到另一个重要工具,也在“tools”目录下,“adb.exe”。
adb:
adb(Android Debug Bridge)是Android 提供的一个通用的调试工具,借助这个工具,我们可以管理设备或手机 模拟器 的状态 。还可以进行以下的操作:
1、快速更新设备或手机模拟器中的代码,如应用或Android系统升级;
2、在设备上运行shell命令;
3、管理设备或手机模拟器上的预定端口;
4、在设备或手机模拟器上复制或粘贴文件
一些常用的操作:
进入Shell: [...]