Android的Java代码优化

在深入开发之前,你应该意识到代码优化不是应用开发的首要任务。提供良好的用户体验并专注于代码的可维护性才是首要任务。


1.Android如何执行代码

我们需要分清楚:最终Android应用只包含Dalvik字节码,而不是Java字节码。

APK文件只是简单的ZIP压缩文件,可以用常见的压缩工具解压。

Dalvik虚拟机是基于寄存器(虚拟寄存器,非真实的硬件寄存器),Sun的java虚拟机JVM是基于栈。

Java指令是16位的,JVM和DEX指令集基本也是16位。

Android2.2中引入了实时编译器(JIT)。Dalvik JIT编译器把Dalvik字节码编译成本地代码,这样可以明显加快执行速度。

在应用的manifest配置里可以用Android:vmSafeMode启用或禁用JIT编译器。默认是启动。


2.Java算法优化

Java所有基本类型中(除了boolean),long是64位,int32位,short是16位。所有整数类型都是有符号的。

BigInteger对象可以容纳任意大小的有符号整数,这是解决很多数值超过64位后的一种解决方案。

基于性能方面的考虑,在代码的关键路径上要尽可能避免内存分配。

优化往往使源代码难于阅读、理解和维护。强烈建议你先实现一个能运行的解决方案,然后再考虑优化。有一句高德纳的名言:“过早的优化是噩梦之源”

Java语言规范说了两件事:A、Error类及其子类是普通程序中抛出的异常,它通常是不期望能够恢复的。B、精密的程序可能希望抓住这类异常并试图从错误异常中恢复。

与直觉相反,并非所有异常都是Exception的子类。所有异常都是Throwable的子类(只有Exception和Error是它的直接子类)。

3.缓存结果

Android定义了SparseArray类,当键值是整数时,效率比HashMap高。

android.util.LruCache这个3.1版本后的缓存工具类。还是建议自己写一个LRU。

API等级,试图调用不存在的API将导致崩溃。可以用反射来检查是否存在SDK_INT字段(是否高于1.6版本)。不过反射会使代码变慢,因此,在性能至关重要的地方应尽量避免使用反射。替代的办法是在静态初始化块里调用Class.forName(),Class.getMethod()确认制定方法是否存在,在性能要求搞的地方只调用Method.invoke()即可。

指定maxSdkVersion可能导致Android更新后,应用自动被卸载,所以不建议指定max sdk version。

Android Market使用minSdkVersion和maxSdkVersion属性来筛选可供特定设备下载安装的应用,其它属性也同样可以用来筛选。

4.响应能力

在Android基础组件中的onSomething()方法都是由主线程(UI线程)调用。主线程主要处理:按键事件(onKeyDown等)、绘制View(onDraw)和调用生命周期(onCreate等)。应用只有一个主线程,所有的事件都按顺序处理。

展开资源是一个开销相对较大的操作,所以尽量降低布局的复杂性。几个降低布局复杂性的步骤:A、使用RelativeLayout代替LinearLayout,尽可能“扁平化”设计布局。此外,减少创建的对象数量。B、使用ViewStub推迟对象创建。

优化的基本原则是保持应用的持续响应,让主线程尽可能快得完成任务。

写程序时,应该始终假定两种情况:A、网络很慢。B、文件系统访问速度很慢。结论就是不应该在主线程内进行网络操作或者访问文件系统。

StrictMode是检测不良行为的工具。注意:只在开发阶段启用StrictMode,发布应用时,记得禁用。


5.SQLite

SQLite语句、事务和查询。SQLite语句创建时,使用StringBuffer对象(推荐使用)或调用String.format可以提高性能。

SQLite内部有虚拟机,处理字节码指令。使用compileStatement让语句在循环外只编译一次。

显示创建事务有以下两个基本特性:原子提交和性能更好。一次性事务是解决批量或数据库在持久存储中的较好方法。

查询时,只读取需要的数据才是上上之选。


以上内容是《Android应用性能优化》第一章节的读后整理。如需要了解详细内容或者深入学习,请查看此书。后续读后感请继续关注本博客:

http://blog.csdn.net/forlong401



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值