android 程序效率,Android开发过程中的性能和效率问题

在Android应用开发过程中,最让人头疼的无疑就是耗内存、耗电、程序无应答(ANR)、Crash掉,这些问题对于一个应用来说,是致命的。当一款应用发布之前,这些问题都是需要进行多遍测试,最终确定应用的性能达到最优之后,才能发布,否则,一款应用发布不到几天,差评就会一大堆,接下来就是大家都摒弃它。下面就从这些方面,说一说Android开发中的性能优化问题。

一,线程的使用

线程在Android开发中占着很大的比重,但是线程又不能随便使用,更不能滥用,下面就从几个方面来说说线程的使用。

1.在后台消除线程操作

App在运行过程中,所有的操作都是在主线程中进行的,这样App的响应速度就会收到严重影响,会导致程序陷入卡顿、死掉更有甚至发生系统错误。

为了加快响应速度,需要将耗时的操作(网络请求、数据库查询或者更加复杂的计算)从主线程中移出,放到一个单独的线程完成,但是解决这一问题的最高效的方式就是使用AsyncTask或者是IntentService来创建后台操作。AsyncTask的使用,主要是将耗时的操作封装到doBackGround中,在主线程中调用AsyncTask.excute()方法启动异步任务即可。如果选择使用IntentService的话,它会在需要的时候启动起来,然后将所有的请求Intent放到一个队列中,通过一个工作线程来一个一个的执行。在使用IntentService需要注意一下几个限制点:

a.这个类不要给UI传递信息,如果要向用户展示处理结果就使用Activity;

b.它使用工作线程来处理的,所以对于多个请求,它是按照顺序来完成,每次只能处理一个请求;

c.每一个处理请求都是不可中断的。

d.IntentServcie和Service的主要不同是,Service是一个后台进程,它可以执行一直驻留在内存中的操作,但是在它里面还是不能执行耗时的操作,它里面执行耗时操作时也是启动线程来完成的,但是IntentService比Service的优势就在于,它可以在其中执行耗时操作而不会ANR。

2.保持响应避免发生ANR

ANR(Application Not Responding)即应用程序无响应,通常的做法就是从UI主线程中移除费时的操作,这其中用的最多的就是AsyncTask,通过它创建一个后台工作线程,异步执行耗时的操作。为了避免ANR还是应该记得:UI线程的响应时间要控制在3秒以内,Service的控制在5秒,Broadcast的控制在10秒,超过这些阈值,程序就会发生ANR,避免ANR最好的方法就是使用异步任务,但是也可以使用Thread类或者是HandlerThread类,但是这些方式都会使APP变的很慢,因为默认的线程优先级和主线程的优先级是一样的,除非你手动的设置创建的线程的优先级。

3.在线程中使用CursorLoader来初始化查询操作

当查询操作在后台进行处理时,展示的数据并不是即时数据,但是可以使用CursorLoader对象来加速查询,这种操作可以使得Activity和用户之间的互动不受影响。使用这个类之后,App会为ContentProvider初始化一个独立的后台的线程进行查询,当查询结束之后会通过它的回调方法将结果返回。这在ListView、GridView等装载数据的容器中使用是非常好的,用户体验很好。

4.线程使用过程中其他需要注意的地方

使用严苛模式(StrictMode) 来检查UI线程中可能潜在的费时操作。

使用一些特殊的工具比如Systrace或者TraceView来查找应用中的瓶颈;

在做一些耗时操作时使用进度条来展示操作进度,以改善用户体验;

当初始化操作很费时时,展示一个Splash或者欢迎界面。

二.优化用电量

如果一款应用在使用过程中是非常耗电的,那么用户体验就会非常差,有时候查到用户根本无法容忍的地步,刚一安装就直接写在。在开发应用的过程中,主要费电的操作为:在更新数据是执行唤醒操作、使用EDGE或者3G来传递数据、文本数据转换,进行非JIT正则表达式操作。下面就从几个方面来说说如何优化程序耗电。

1.优化网络

如果App需要执行网络操作,在没有网络的情况下,请让应用跳过网络操作并给出提示,而且要保证只在有网络连接并且无漫游的情况下进行数据更新;

对于含有文本数据和二进制数据的请求,选择使用兼容的数据格式,将这些请求全部转换成二进制数据格式请求;

选择高效的转换工具,多使用流式转换工具,少使用树形的转换工具;

减少重复访问服务器的操作;

如果可以的话,使用framework的GZIP库来压缩文本数据,以便高效使用CPU资源。

2.优化前端工作

在使用wakeLocks时,尽量设置为最低级别;

在进行网络请求时,设置超时时间,来防止潜在的Bug导致的耗电;

使用android:keepScreenOn属性,设置屏幕的亮与暗;

除了系统的GC操作,应该多多的进行手动java对象的回收,比如XmlPullParseFactory和BitmapFactory. 还有正则表达式的Matcher.reset(newString)操作、

StringBuilder.setLength(0)操作;

在使用集合时,尤其是在线程中,尽量使用StringBuilder少使用StringBuffer,使用HashTable不使用HashMap,使用Vector不使用List,因为后者都是线程不安全的,尽管在速度上后者占优,但是出于安全的考虑还是多使用前者;

在ListView中多使用重用机制,在BaseAdapter中的getView()方法在返回View对象时,应该多使用convertView参数,一般情况下,都是先判断它是不是null,如果不是null,则返回它,为null的话就是用LayoutInflater.inflate()来加载一个布局文件,装载到创建的View对象中,返回。

3.优化前台应用

确保开启的Service的生命周期是短暂的,因为每一个进程都需要2MB的内存,并且当前台程序在需要内存时会重新启动;

保持内存的使用量不要太大;

在设备处于唤醒状态时对Service进行定时更新;

Service在pull或者是Sleep状态都是不好的,这就是为什么在服务结束时要使用AlarmManager或者配置属性stopSelf()的原因。

4.其他的注意方面

在进行整体更新之前应该检查电量和网络状态,保证在电量充足和网络状态最佳的情况下进行大幅度的更新操作;

在更新周期、后台操作时让用户能够看到用电情况。

三.显示低内存UI

当我们为布局单独创建UI的时候,就是在创建耗内存的App,她在UI中会出现可恶的延时。要想实现一个流畅的、低内存占用的UI,第一步就是搜索,找出应用中的潜在的瓶颈,可以使用Android自带的工具Hierarchy Viewer Tool工具或者是Lint。Lint可以检查代码,将可能存在的bug扫描出来,并且能够对空间结果进行优化。

布局上面出现问题时,应该考虑使用更加灵活的布局来代替绝对的布局,这样会减少布局层次,使得程序不那么累赘。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值