Android的性能优化
2016-04-19 23:09
274 查看
一款好的AndroidAPP不仅在功能上让用户接受,用户体验也是很重要的一部分,什么叫体验,也就是性能上的稳定。如何做到让自己开发的APP性能上提高,这是很多程序员很苦恼的一件事情,下面结合我自己对Android开发的理解,浅谈一下Android的性能优化的几个方面,有什么地方说的不对的,欢迎读者耐心指出。
性能优化方案一:主线程中的耗时操作。
Google在Android4.0版本以后增加了一个机制,程序中如果存在有在主线程中进行的耗时操作,程序会自动的Crash掉。我们知道App运行过程中所有的操作都默认在主线程(UI线程)中进行的,这样App的响应速度就会受到影响。会导致程序陷入卡顿、死掉甚至会发生系统错误。为了加快响应速度,需要把费时的操作(比如网络请求、数据库操作或者复杂的计算)从主线程移动到一个单独的线程中,Google也为我们提供了解决方案,AsyncTask或者IntentService来创建后台操作,并且使用Handler来进行线程中的通信,通过Handler把后台处理的操作传递给UI线程进行UI的更新,这大大的提高了我们的项目的耦合性。
性能优化方案二:在线程中初始化查询操作
当查询操作正在后台处理时,展示数据也不是即时的,但是你可以使用CursorLoader对象来加快速度,这个操作可以使Activity和用户之间的互动不受影响。
使用这个对象后,你的App会为ContentProvider初始化一个独立的后台线程进行查询,当查询结束后就会给调用查询的Activity返回结果。
性能优化方案三:禁止ANR情况的出现
体验度最差的就是发生了ANR的错误,没有之一。在子线程中进行耗时操作这个方式还可以防止用户操作出现系统不响应(ANR)对话框。需要做的就是继承AsyncTask来创建一个后台工作线程,并实现doInBackground()方法。还有一种方式就是自己创建一个Thread类或者HandlerThread类。需要注意这样也会使App变慢,因为默认的线程优先级和主线程的优先级是一样的,除非你明确设定线程的优先级。
性能优化方案四:网络通信的优化
Android中的网络通信是非常常见的,网络属于严重的耗时操作,所以一定要在子线程中进行操作,将返回的结果回调给UI线程进行UI的更新,这是其一,还有几个比较重要的需要了解一下。
1、如果没有网络连接,请让你的应用跳过网络操作;只在有网络连接并且无漫游的情况下更新数据;
2、为了更快的用户体验,请减少重复访问服务器的操作;
3、使用高效的转换工具,多考虑使用流式转换工具,少用树形的转换工具,因为树形的转换方式是非常耗费内存资源的。
性能优化方案五:布局的优化
更多的开发者在进行UI布局的时候更倾向于LinearLayout,因为这种布局是非常好控制的,但是一般LinearLayout是绝不能超过四层嵌套的,如果超过了四层,性能会见降低,为什么呢?我们知道,线性布局在Activity中是通过绘制来展现给用户的,那么也就是说只有把所有的界面控件全都绘制完成之后,UI才会展现在用户面前,如过河个布局相当复杂的话,绘制的时间就会很长,用户等待的时间就会很长,这种体验度是极差的。而RelativeLayout的机制却不是这样子的,相对布局是先绘制出其中的一个,根据这一个再去绘制与之相关的另一个View,这样的话,UI会瞬间加载一部分,然后逐渐在加载完成,在用户看来,这个程序正在伟宁的执行,而不是出于假死的状态。
所以最好的方式就是RelativeLayout和LinearLayout交互使用,大的模块我们使用RelativeLayout进行布局,细节方面我们就使用LinearLayout,这样体验度是极好的。
还有一些比较细节的问题,就是ListView的优化,Viewpager的优化,防止出现OOM的发生等一些情况,这里就不一一列出了,希望我总结的这些可以帮到一些朋友。
性能优化方案一:主线程中的耗时操作。
Google在Android4.0版本以后增加了一个机制,程序中如果存在有在主线程中进行的耗时操作,程序会自动的Crash掉。我们知道App运行过程中所有的操作都默认在主线程(UI线程)中进行的,这样App的响应速度就会受到影响。会导致程序陷入卡顿、死掉甚至会发生系统错误。为了加快响应速度,需要把费时的操作(比如网络请求、数据库操作或者复杂的计算)从主线程移动到一个单独的线程中,Google也为我们提供了解决方案,AsyncTask或者IntentService来创建后台操作,并且使用Handler来进行线程中的通信,通过Handler把后台处理的操作传递给UI线程进行UI的更新,这大大的提高了我们的项目的耦合性。
性能优化方案二:在线程中初始化查询操作
当查询操作正在后台处理时,展示数据也不是即时的,但是你可以使用CursorLoader对象来加快速度,这个操作可以使Activity和用户之间的互动不受影响。
使用这个对象后,你的App会为ContentProvider初始化一个独立的后台线程进行查询,当查询结束后就会给调用查询的Activity返回结果。
性能优化方案三:禁止ANR情况的出现
体验度最差的就是发生了ANR的错误,没有之一。在子线程中进行耗时操作这个方式还可以防止用户操作出现系统不响应(ANR)对话框。需要做的就是继承AsyncTask来创建一个后台工作线程,并实现doInBackground()方法。还有一种方式就是自己创建一个Thread类或者HandlerThread类。需要注意这样也会使App变慢,因为默认的线程优先级和主线程的优先级是一样的,除非你明确设定线程的优先级。
性能优化方案四:网络通信的优化
Android中的网络通信是非常常见的,网络属于严重的耗时操作,所以一定要在子线程中进行操作,将返回的结果回调给UI线程进行UI的更新,这是其一,还有几个比较重要的需要了解一下。
1、如果没有网络连接,请让你的应用跳过网络操作;只在有网络连接并且无漫游的情况下更新数据;
2、为了更快的用户体验,请减少重复访问服务器的操作;
3、使用高效的转换工具,多考虑使用流式转换工具,少用树形的转换工具,因为树形的转换方式是非常耗费内存资源的。
性能优化方案五:布局的优化
更多的开发者在进行UI布局的时候更倾向于LinearLayout,因为这种布局是非常好控制的,但是一般LinearLayout是绝不能超过四层嵌套的,如果超过了四层,性能会见降低,为什么呢?我们知道,线性布局在Activity中是通过绘制来展现给用户的,那么也就是说只有把所有的界面控件全都绘制完成之后,UI才会展现在用户面前,如过河个布局相当复杂的话,绘制的时间就会很长,用户等待的时间就会很长,这种体验度是极差的。而RelativeLayout的机制却不是这样子的,相对布局是先绘制出其中的一个,根据这一个再去绘制与之相关的另一个View,这样的话,UI会瞬间加载一部分,然后逐渐在加载完成,在用户看来,这个程序正在伟宁的执行,而不是出于假死的状态。
所以最好的方式就是RelativeLayout和LinearLayout交互使用,大的模块我们使用RelativeLayout进行布局,细节方面我们就使用LinearLayout,这样体验度是极好的。
还有一些比较细节的问题,就是ListView的优化,Viewpager的优化,防止出现OOM的发生等一些情况,这里就不一一列出了,希望我总结的这些可以帮到一些朋友。
相关文章推荐
- Android 编码规范
- Android--多线程之Handler(转)
- Android touch事件分析
- Android使用ListView时item失效解决方案
- Android studio 如何导入并引用Library工程
- 关于AndroidMainfest中配置的知识
- 关于Android bound Service 攻击和防御
- Android清除本地数据缓存代码
- Android系统中自带的图标&一些预定义样式&参考颜色值
- Android Studio、 补充知识以及主要组件
- Android笔记--解决使用php文件插入数据到mysql数据库的表中中文变问号的问题
- Android概述
- 【Android】图片切割
- Android计算器界面 TableLayout
- Android几种常见的多渠道(批量)打包方式介绍
- Android短信页面
- android第一步---环境搭建
- Android 中 WebView 与 js 简单交互实现图文混排效果,解决图片自适应屏幕与查看大图问题
- Android--帧动画
- Android下的图片压缩及图片和视频的上传