• [转]编写高效的Android代码

    编写高效的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 [...]

  • ADT 安装过程中的错误: requires plug-in org.eclipse.wst.sse.ui.

    大家在学习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进行后续安装,根据自己网络速度的不同,可能需要一段时间,就安心地等待吧(不再赘述)。

  • [转]为什么Android将掀起一场手机领域的狂风

    整个 2007 年的 9 月,我都把时间花在了撰写《 从 Java EE 到 Java ME 的通讯 》这篇文章上。其实这并不是对 2 年前的项目进行整理并 post 出来而已,这完全不是主要目的!!!
    看 官们完全没有理解我的用意,我得到的全是“文章转载”这样的留言回复!那篇文章的感言我这样写的:“要实现遐想并解释上面的问题有待于广大开发者的共同努 力,把自己的业余时间都投入在类似 db4oME 这样的技术上,如果这样的分布式数据库能成功实现,我想这会给移动计算带来一场革命,更多依托网络、数据库的手机应用程序将会诞生,发挥 Java 强大的优势!”
    我是 2007 年 11 月底得知 Android 的,正好对应了上面的感言!不知道国人是怎么想的,难道做手机应用程序没有做手机游戏有前途,还是无话可说只能对我的感言嗤之以鼻?如果是这样,那么看了本文之后也许会让你如梦初觉 ……
    为 手机 设备而生的 Android软件开发集合包 已经 发布了一周 。作为 db4o对象数据库 创始人的我来讲,这是我们的产品和公司最值得兴奋的事件之一。
    Android 将把零散的手机开发平台统一起来,而且它可以开发基于位置的应用程序来服务全世界的用户。这就是为什么会掀起一场手机领域狂风的原因。
    内容
    (略,参考下面详细标题。)
    这场狂风的前景
    从 全球化观点来看,手机操作系统是非常之零碎的。手机制造商和运营商这些关键角色,他们都有自己的一套私有技术。被认为是全球性的如 Symbian ,微软和 Apple 都显得较小了,他们每年分别为全球提供 60million 、 20million 以及计划的 10million 部手机。
    由于没有标准的操作系统,运营商倾向于使写出的应用程序能让普通浏览器以 Ajax ( Javascript )方式运行。在手机上面运行 Ajax [...]

  • Android模拟器入门

    要玩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: [...]