关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » 安卓开发 »Android性能优化篇:从代码角度进行优化

    Android性能优化篇:从代码角度进行优化

    2014-11-28 00:00:00 出处:apkbus
    分享

    通常我们写程序,都是在项目计划的压力下完成的,此时完成的代码可以完成具体业务逻辑,但是性能不一定是最优化的。一般来说,优秀的程序员在写完代码之后都会不断的对代码进行重构。重构的好处有很多,其中一点,就是对代码进行优化,提高软件的性能。下面我们就从几个方面来了解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。

    不要在循环当中声明临时变量,不要在循环中捕获异常。

    假如对于线程安全没有要求,尽量使用线程不安全的集合对象。

    使用集合对象,假如事先知道其大小,则可以在构造方法中设置初始大小。

    文件读取操作需要使用缓存类,及时关闭文件。

    慎用异常,使用异常会导致性能降低。

    假如程序会频繁创建线程,则可以考虑使用线程池。

    经验分享:

    代码的微优化有很多很多东西可以讲,小到一个变量的声明,大到一段算法。尤其在代码Review的过程中,可能会反复审查代码是否可以优化。不过我认为,代码的微优化是非常耗费时间的,没有必要从头到尾将所有代码都优化一遍。开发者应该根据具体的业务逻辑去专门针对某部分代码做优化。比如应用中可能有一些方法会被反复调用,那么这部分代码就值得专门做优化。其它的代码,需要开发者在写代码过程中去注意。

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    正版 Windows 11产品密钥怎么查找/查看?

    还有3个月,微软将停止 Windows 10 的更新

    Windows 10 终止支持后,企业为何要立即升级?

    Windows 10 将于 2025年10 月终止技术支持,建议迁移到 Windows 11

    Windows 12 发布推迟,微软正全力筹备Windows 11 25H2更新

    Linux 退出 mail的命令是什么

    Linux 提醒 No space left on device,但我的空间看起来还有不少空余呢

    hiberfil.sys文件可以删除吗?了解该文件并手把手教你删除C盘的hiberfil.sys文件

    Window 10和 Windows 11哪个好?答案是:看你自己的需求

    盗版软件成公司里的“隐形炸弹”?老板们的“法务噩梦” 有救了!

    IT头条

    公安部:我国在售汽车搭载的“智驾”系统都不具备“自动驾驶”功能

    02:03

    液冷服务器概念股走强,博汇、润泽等液冷概念股票大涨

    01:17

    亚太地区的 AI 驱动型医疗保健:2025 年及以后的下一步是什么?

    16:30

    智能手机市场风云:iPhone领跑销量榜,华为缺席引争议

    15:43

    大数据算法和“老师傅”经验叠加 智慧化收储粮食尽显“科技范”

    15:17

    技术热点

    SQL汉字转换为拼音的函数

    windows 7系统无法运行Photoshop CS3的解决方法

    巧用MySQL加密函数对Web网站敏感数据进行保护

    MySQL基础知识简介

    Windows7和WinXP下如何实现不输密码自动登录系统的设置方法介绍

    windows 7系统ip地址冲突怎么办?windows 7系统IP地址冲突问题的

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。