通常我们写程序,都是在项目计划的压力下完成的,此时完成的代码可以完成具体业务逻辑,但是性能不一定是最优化的。一般来说,优秀的程序员在写完代码之后都会不断的对代码进行重构。重构的好处有很多,其中一点,就是对代码进行优化,提高软件的性能。下面我们就从几个方面来了解Android开发过程中的代码优化。
1)静态变量引起内存泄露
在代码优化的过程中,我们需要对代码中的静态变量特别留意。静态变量是类相关的变量,它的生命周期是从这个类被声明,到这个类彻底被垃圾回收器回收才会被销毁。所以,一般情况下,静态变量从所在的类被使用开始就要一直占用着内存空间,直到程序退出。如果不注意,静态变量引用了占用大量内存的资源,造成垃圾回收器无法对内存进行回收,就可能造成内存的浪费。
先来看一段代码,这段代码定义了一个Activity。
private static Resources mResources;
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
if (mResources == null) {
mResources = this.getResources();
}
}
这段代码中有一个静态的Resources对象。代码片段mResources = this.getResources()对Resources对象进行了初始化。这时Resources对象拥有了当前Activity对象的引用,Activity又引用了整个页面中所有的对象。
如果当前的Activity被重新创建(比如横竖屏切换,默认情况下整个Activity会被重新创建),由于Resources引用了第一次创建的Activity,就会导致第一次创建的Activity不能被垃圾回收器回收,从而导致第一次创建的Activity中的所有对象都不能被回收。这个时候,一部分内存就浪费掉了。
经验分享:
在实际项目中,我们经常会把一些对象的引用加入到集合中,如果这个集合是静态的话,就需要特别注意了。当不需要某对象时,务必及时把它的引用从集合中清理掉。或者可以为集合提供一种更新策略,及时更新整个集合,这样可以保证集合的大小不超过某值,避免内存空间的浪费。
2)使用Application的Context
在Android中,Application Context的生命周期和应用的生命周期一样长,而不是取决于某个Activity的生命周期。如果想保持一个长期生命的对象,并且这个对象需要一个Context,就可以使用Application对象。可以通过调用Context.getApplicationContext()方法或者Activity.getApplication()方法来获得Application对象。
依然拿上面的代码作为例子。可以将代码修改成下面的样子。
private static Resources mResources;
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
if (mResources == null) {
// mResources = this.getResources();
mResources = this.getApplication().getResources();
}
}
在这里将this.getResources()修改为this.getApplication().getResources()。修改以后,Resources对象拥有的是Application对象的引用。如果Activity被重新创建,第一次创建的Activity就可以被回收了。
3)及时关闭资源
Cursor是Android查询数据后得到的一个管理数据集合的类。正常情况下,如果我们没有关闭它,系统会在回收它时进行关闭,但是这样的效率特别低。如果查询得到的数据量较小时还好,如果Cursor的数据量非常大,特别是如果里面有Blob信息时,就可能出现内存问题。所以一定要及时关闭Cursor。
下面给出一个通用的使用Cursor的代码片段。
Cursor cursor = null;
try{
cursor = mContext.getContentResolver().query(uri,null,null,null,null);
if (cursor != null) {
cursor.moveToFirst();
// 处理数据
}
} catch (Exception e){
e.printStatckTrace();
} finally {
if (cursor != null){
cursor.close();
}
}
即对异常进行捕获,并且在finally中将cursor关闭。
同样的,在使用文件的时候,也要及时关闭。
4)使用Bitmap及时调用recycle()
前面的章节讲过,在不使用Bitmap对象时,需要调用recycle()释放内存,然后将它设置为null。虽然调用recycle()并不能保证立即释放占用的内存,但是可以加速Bitmap的内存的释放。
在代码优化的过程中,如果发现某个Activity用到了Bitmap对象,却没有显式的调用recycle()释放内存,则需要分析代码逻辑,增加相关代码,在不再使用Bitmap以后调用recycle()释放内存。
5)对Adapter进行优化
下面以构造ListView的BaseAdapter为例说明如何对Adapter进行优化。
在BaseAdapter类中提供了如下方法:
public View getView(int position, View convertView, ViewGroup parent)
当ListView列表里的每一项显示时,都会调用Adapter的getView方法返回一个View,
来向ListView提供所需要的View对象。
下面是一个完整的getView()方法的代码示例。
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item, null);
holder = new ViewHolder();
holder.text = (TextView) convertView.findViewById(R.id.text);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.text.setText("line" + position);
return convertView;
}
private class ViewHolder {
TextView text;
}
当向上滚动ListView时,getView()方法会被反复调用。getView()的第二个参数convertView是被缓存起来的List条目中的View对象。当ListView滑动的时候,getView可能会直接返回旧的convertView。这里使用了convertView和ViewHolder,可以充分利用缓存,避免反复创建View对象和TextView对象。
如果ListView的条目只有几个,这种技巧并不能带来多少性能的提升。但是如果条目有几百甚至几千个,使用这种技巧只会创建几个convertView和ViewHolder(取决于当前界面能够显示的条目数),性能的差别就非常非常大了。
6)代码“微优化”
当今时代已经进入了“微时代”。这里的“微优化”指的是代码层面的细节优化,即不改动代码整体结构,不改变程序原有的逻辑。尽管Android使用的是Dalvik虚拟机,但是传统的Java方面的代码优化技巧在Android开发中也都是适用的。
下面简要列举一部分。因为一般Java开发者都能够理解,就不再做具体的代码说明。
创建新的对象都需要额外的内存空间,要尽量减少创建新的对象。
将类、变量、方法等等的可见性修改为最小。
针对字符串的拼接,使用StringBuffer替代String。
不要在循环当中声明临时变量,不要在循环中捕获异常。
如果对于线程安全没有要求,尽量使用线程不安全的集合对象。
使用集合对象,如果事先知道其大小,则可以在构造方法中设置初始大小。
文件读取操作需要使用缓存类,及时关闭文件。
慎用异常,使用异常会导致性能降低。
如果程序会频繁创建线程,则可以考虑使用线程池。
相关推荐
本书将探讨如何在保证应用性能的前提下,通过优化代码来减少功耗。这包括对Android系统的电源管理机制的理解,比如如何合理安排服务和广播接收器,如何管理唤醒锁,以及如何减少传感器、网络和CPU的功耗。 综上所述...
《mars_Android源代码全集》是一份宝贵的资源,它汇集了知名讲师mars在Android开发领域的精华教学内容。这份资源包含了他的前三季Android源代码,是Android开发者学习和提升技能的绝佳材料。通过深入研究这些代码,...
mars老师的教程中,第一季通常会从最基础的概念入手,讲解如何搭建Android开发环境,包括安装Android Studio、配置SDK,以及创建第一个Hello World项目。此外,还会介绍AndroidManifest.xml文件的重要性,它是每个...
在Android平台上开发考勤系统是一项常见的任务,...如果你打算深入研究这个考勤系统,建议先从整体架构入手,理解各个模块之间的关系,然后逐个分析关键类和方法,最后结合Android Studio的调试工具进行测试和优化。
VLC是一款广受欢迎的开源媒体播放器,它支持多种视频和音频格式,具有跨平台的特点。在Android平台上,VLC...如果要深入了解或参与VLC的Android开发,可以从这些文件入手,学习其架构设计、编码规范以及如何扩展功能。
源码分析有助于理解垃圾回收机制、类加载过程以及优化代码执行速度。 7. **UI系统**:Android使用View和 ViewGroup体系构建用户界面。源代码分析可以帮助开发者实现自定义视图,优化渲染性能。 8. **权限管理系统*...
针对Android应用的性能优化,可以从以下几个方面入手: ##### 1. 启动速度优化 - **减少初始化代码**:避免在应用启动时执行耗时操作。 - **懒加载资源**:按需加载资源,而不是一次性加载所有资源。 ##### 2. ...
Android Studio是官方推荐的Android开发IDE(Integrated Development Environment),它内置了代码编辑器、调试器、模拟器以及用于构建Android应用的工具链。 #### 2. Android项目结构与组件 一个Android项目中通常...
首先,让我们从"疯狂足球"源代码入手。在Android平台上构建一款足球游戏,开发者通常会使用Android Studio作为集成开发环境,并采用Java或Kotlin作为主要编程语言。源代码中可能包含了游戏逻辑、用户界面(UI)设计...
- **基础入门**:适合没有Android开发经验的新手,主要介绍Android开发环境搭建、Java或Kotlin语言基础、UI设计等内容。 - **进阶实战**:针对有一定开发基础的学习者,包括视频播放器开发、流媒体处理、视频编辑等...
对于初学者,可以从以下几个步骤入手学习: 1. 阅读主Activity的代码,了解程序的入口点及整体架构。 2. 分析UI布局文件,理解界面元素的组织方式。 3. 研究数据库操作类,理解数据存取的逻辑。 4. 查看网络请求...
【Android重力球游戏源代码】是一个专门为Android平台设计的游戏应用程序,它展示了如何在Android开发环境中,使用Android SDK和ADT(Android Developer Tools)构建一个完整的互动游戏。这个游戏被称为"TableBall...
《罗升阳-Android系统源代码情景分析》是一本深入探讨Android系统源代码的专业书籍,由知名技术专家罗升阳撰写...通过学习这本书,读者可以提升对Android系统的整体理解和控制能力,从而在Android开发领域更上一层楼。
2. 阅读源码:从关键组件入手,如系统服务、核心库,逐步扩大阅读范围。 3. 参与社区:在Stack Overflow、XDA Developers等论坛提问和交流,获取实践经验。 4. 编写实验项目:通过修改源码、编译系统,实践所学知识...
总结来说,"Android开发视频源码-mars老师"是一份宝贵的资源,它将帮助学习者系统学习Android开发,通过实际的项目代码加深理论理解,提升编程技能。无论你是初学者还是有一定经验的开发者,都可以从中获益,不断...
因为没有了人为制造的障碍,所以Android开发人员可以自由地编写能够充分利用日益强大的手机硬件的应用程序。因此,对Android感兴趣的开发人员都把Google在2008年发布Android这一举措作为移动技术发展史上的一个非常...
总而言之,这份“Android文档 开发必备”涵盖了Android开发的方方面面,从基础到高级,从理论到实践,是每位Android开发者不可或缺的学习资料。通过深入研读和实践,你将能够掌握Android开发的精髓,构建出高质量的...
开发者需要安装并配置Android Studio,这是Google官方提供的集成开发环境(IDE),集成了调试工具、布局编辑器、性能分析工具等,方便编写、测试和优化代码。 在Android应用结构方面,掌握Activity、Service、...
首先,从源代码入手,我们可以研究每个应用的架构、设计模式和编程技巧。这些源码可能涵盖了不同的功能模块,如用户界面(UI)设计、数据存储(SQLite或SharedPreferences)、网络通信(如使用Retrofit或Volley库)...
**源码分析** 对于这个项目的源码学习,可以从以下几个方面入手: 1. **模块划分**:理解各个类和函数的作用,例如音频/视频数据的捕获和发送模块、网络连接和数据传输模块、用户界面展示模块等。 2. **API调用**:...