10种提升android运行效率的建议
作者:banq 发布时间:2022-08-15 23:45:41
目录
一、有效的线程
1. 如何使用后台线程以避免前台负载过荷?
2.如何避免应用不响应ANR?
3. 如何在分离的线程中初始化查询?
4.其他
二、设备电池的优化
5. 如何优化网络?
6. 如何优化前台应用?
7.如何优化后台运行的应用?
8. 其他
三、使用最少内存实现UI
9. 如何分辨出布局性能问题?
如何让安卓程序在有限的内存和电池资源下流畅快速有效率的运行,下面给出了10种实践中的建议:
一、有效的线程
1. 如何使用后台线程以避免前台负载过荷?
默认情况下,应用程序的所有操作都是在前台的主线程(UI线程)上运行的,应用程序响应能力可能会受到影响,会导致当机,死机,甚至系统错误。为了提升反应能力,应该将长时间运行的任务(如网络或数据库操作,复杂的计算)搬离应用程序的主线程,切换到以一个单独的后台线程方式运行。
完成这一切换任务的最有效方法是在类级别。您可以使用AsyncTask
类或IntentService
类来组织后台工作。一旦你实现了一个IntentService
,它会在需要的时候启动,使用新的一个工作线程处理请求(意图)。
当使用IntentService
,你应该考虑以下限制:
这个类没有把结果送给UI,所以为了显示结果,需要使用
Activity
。一次只有一个请求被处理。
任何请求处理不能中断。
2.如何避免应用不响应ANR?
为了避免应用程序长时间无应答ANR,将长任务操作从UI主线程卸载到后台线程运行,你可以通过继承AsyncTask
和实现 doInBackground()
方式来实现
另外一个方式是创建一个线程或HandlerThread
实现类,值得注意的是,你还需要规定线程的"后台" 线程权限,因为这个新线程缺省权限和UI线程是一样的,同样会拖慢整个应用运行速度。
3. 如何在分离的线程中初始化查询?
数据显示并不是即时的,尽管你使用CursorLoader
对象可以加快提速,这个对象可以在不打扰用户和Activity
交互情况下,查询在后台进行。
使用这个对象武装你的应用,在对于每个ContentProvider
查询操作初始化一个单独的后台线程,然后只有在查询完成时将返回给Activity
。
4.其他
使用
StrictMode
探测UI线程中你要实现操作的潜在可能的长任务操作。使用特殊工具,如
Systrace
,Traceview
来发现你的应用中响应瓶颈。显示操作流程图标
如果初始安装非常耗时,显示启动画面。
二、设备电池的优化
主要影响电池耗电时间有:
定期的唤醒更新
通过
3G
和EDGE
的数据传递文本数据解析 没有
JIT
的正则表达式
5. 如何优化网络?
如果没有连接,停止你的应用操作,只有3G或
Wifi
可连接时更新。选择压缩数据,比如将文本和二进制数据打包在一个请求中。
使用有效率的解析器,使用流
Stream
解析而不是树tree
解析器。减少与服务器的往返时间次数
有可能对文本数据使用
GZIP
,充分利用CPU
资源。
6. 如何优化前台应用?
当设计唤醒锁时,请尽可能设置最低级别。
避免潜在的
Bug
引起的电池消耗,使用timeout
,杜绝死循环。激活
android
:keepScreenOn
.考虑手动让GC垃圾回收Java对象,如
XmlPullParserFactory
和BitmapFactory
,对于正则使用Matcher.reset
(newString
) , 使用StringBuilder.setLength(0).
小心同步操作
synchronization
,尽管它在被UI线程驱动时是安全的。在
ListView
中要多用循环利用策略,尽量多重用一个组件尽可能使用网络定位而不是GPS,
在
onPause
中一定要注销GPS更新,用户自己能在设置中激活GPS计算浮点需要很多电池,你也许要考虑地理数学等方面的精度,当在使用
DisplayMetrics
执行DPI tasks with
.时,缓存计算结果。
7.如何优化后台运行的应用?
因为每个流程需要2M,当前台程序需要内存时需要重启,确保每个服务是短生命周期。
尽量使内存消耗低
设计应用每30分钟更新,但是只能在设备唤醒情况下。
服务Service
睡眠是不好的,应答使用AlarmManager
或<receiver>
这样manifest
元素,当完成时调用stopSelf()
,当启动服务时,使用AlarmManager
,使用*_WAKEUP
要注意,通过setInexactRepeating()
进行复位让安卓能包装你的应用更新,当使用<receiver>
时,动态地在manifest
中激活或失效其组件,特别是空操作情况下。
8. 其他
在进行一个完整更新之前,检查电池和网络状态,进行批量处理时要等待电池较好的状态
提供用户电池使用情况的可选项,以决定更新周期和后台行为。
三、使用最少内存实现UI
9. 如何分辨出布局性能问题?
当你使用布局管理器创建页面时,你可能会引入一些延迟,为了实现平衡 内存消耗少的UI,你需要搜查布局中潜在的性能瓶颈,可以使用安卓SDK
目录<sdk>/tools/
下的Hierarchy Viewer
工具。
另外一个发现性能巍峨提的工具是Lint,它能扫描应用源码中层次寻找Bug
。
10. 如何解决性能问题?
你可以通过压扁层次比如通过从LinearLayout
类转换到使用RelativeLayout
类,压低层次水平。
来源:https://www.jdon.com/android/android-application-development-tips.html


猜你喜欢
- StringString类是不可变类,即一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁。这个
- 一、什么是并查集对于一种数据结构,肯定是有自己的应用场景和特性,那么并查集是处理什么问题的呢?并查集是一种树型的数据结构,用于处理一些不相交
- 多线程经常访问同一资源可能造成什么问题竞态条件和死锁如果两个或多个线程访问相同的对象,或者访问不同步的共享状态 ,就会出现竞态条件;为了避免
- 如果出现:org.apache.ibatis.binding.BindingException: Invalid bound stateme
- JUC包(java.util.concurrent)中提供了对定时任务的支持,即ScheduledExecutorService接口。本文对
- 一、栈1.1 概述Java为什么要有集合类: 临时存储数据。链表的本质: 对象间通过持有和引用关系互相关联起来。线性表: 普通线性表, 操作
- CLR要求每一个类型都最终从object类型派生,如下: class Typer {} === class Typer :object {}
- JPA是什么? JPA(Java Persistence API)是Sun官方提出的Java持久化规范. 为Java开发人员提供了一种对象/
- 普通的excel列表,easyexcel读取是没有什么问题的。但是,如果有合并单元格,那么它读取的时候,能获取数
- properties配置文件如下:human.name=Mr.Yuhuman.age=21human.gender=male如何把prope
- 前言在Java8中接口中不再只有抽象方法,还可以有静态方法以及默认方法,此时的接口更像是一个类。我们一起来看看如何使用吧~Java8中,可以
- 近年来,二维码的使用越来越风生水起,笔者最近手头也遇到了一个需要使用二维码扫码登录网站的活,所以研究了一下这一套机制,并用代码实现了整个流程
- 现象正常情况下修改完代码,运行项目就会立即生效的。但是突然有一天发现运行的还是老的代码,新代码根本没有生效。通过 mvn clean、 in
- 动态规划的基本思想是将待求解问题分解成若干个子问题,先求解子问题,并将这些子问题的解保存起来,如果以后在求解较大子问题的时候需要用到这些子问
- <script>//验证身份证号方法var test=function(idcard){var Errors=new Array
- 简介上一篇我们讲了简单的动态BroadCast,今天我们通过手工来发送一条BroadCast进一步来了解BroadCast。在上一篇里我们使
- Java是怎么跨平台的我们上计算机课的时候老师讲过:"计算机只能识别0和1,所以我们写的程序要经过编译器翻译成0和1组成的二进制格
- System类的常用用法1,主要获取系统的环境变量信息public static void sysProp()throws Exceptio
- 和线程停止相关的三个方法/*中断线程。如果线程被wait(),join(),sleep()等方法阻塞,调用interrupt()会清除线程中
- 前言Condition是在Spring4.0增加的条件判断功能,通过这个功能可以实现选择性的创建Bean对象。引入一个例子SpringBoo