解析Android开发优化之:从代码角度进行优化的技巧_Android

通常我们写程序,都是在项目计划的压力下完成的,此时完成的代码可以完成具体业务逻辑,但是性能不一定是最优化的。一般来说,优秀的程序员在写完代码之后都会不断的对代码进行重构。重构的好处有很多,其中一点,就是对代码进行优化,提高软件的性能。下面我们就从几个方面来了解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的过程中,可能会反复审查代码是否可以优化。不过我认为,代码的微优化是非常耗费时间的,没有必要从头到尾将所有代码都优化一遍。开发者应该根据具体的业务逻辑去专门针对某部分代码做优化。比如应用中可能有一些方法会被反复调用,那么这部分代码就值得专门做优化。其它的代码,需要开发者在写代码过程中去注意。

时间: 2024-10-20 02:58:42

解析Android开发优化之:从代码角度进行优化的技巧_Android的相关文章

Android] Android开发优化之——从代码角度进行优化

通常我们写程序,都是在项目计划的压力下完成的,此时完成的代码可以完成具体业务逻辑,但是性能不一定是最优化的.一般来说,优秀的程序员在写完代码之后都会不断的对代码进行重构.重构的好处有很多,其中一点,就是对代码进行优化,提高软件的性能.下面我们就从几个方面来了解Android开发过程中的代码优化.   1)静态变量引起内存泄露 在代码优化的过程中,我们需要对代码中的静态变量特别留意.静态变量是类相关的变量,它的生命周期是从这个类被声明,到这个类彻底被垃圾回收器回收才会被销毁.所以,一般情况下,静态

安卓-Android开发ListView嵌套GridView,如何更加优化

问题描述 Android开发ListView嵌套GridView,如何更加优化 我在ListView中嵌套GridView,效果实现了,但我在ListView的getView()中是 new GridViewAdapter(``````),也就是说我每一个大的ListView的Item都有去new 一个GridView的适配器,这样对内存不好.可我想通过notifyDataSetChanged()来 改变嵌套的GridView中的数据,一直实现不了...求高手解答··· 解决方案 用viewho

在Android开发中使用java代码的一些问题,求大神来看看。

问题描述 在Android开发中使用java代码的一些问题,求大神来看看. 1.我在MainActivity中定义一个单击事件监听器OnClickListener,这时要导入类,但是import android.view.*; 这样自己定义的OnClickListener会报错.但是 import android.view.View.*和import android.view.View.OnClickListener均不会报错.请问这是怎么回事?import android.view.*不是代表

解析Android开发优化之:对界面UI的优化详解(一)_Android

通常,在这个页面中会用到很多控件,控件会用到很多的资源.Android系统本身有很多的资源,包括各种各样的字符串.图片.动画.样式和布局等等,这些都可以在应用程序中直接使用.这样做的好处很多,既可以减少内存的使用,又可以减少部分工作量,也可以缩减程序安装包的大小. 下面从几个方面来介绍如何利用系统资源. 1)利用系统定义的id 比如我们有一个定义ListView的xml文件,一般的,我们会写类似下面的代码片段. 复制代码 代码如下: <ListView     android:id="@+

解析Android开发优化之:对界面UI的优化详解(一)

通常,在这个页面中会用到很多控件,控件会用到很多的资源.Android系统本身有很多的资源,包括各种各样的字符串.图片.动画.样式和布局等等,这些都可以在应用程序中直接使用.这样做的好处很多,既可以减少内存的使用,又可以减少部分工作量,也可以缩减程序安装包的大小. 下面从几个方面来介绍如何利用系统资源. 1)利用系统定义的id 比如我们有一个定义ListView的xml文件,一般的,我们会写类似下面的代码片段.复制代码 代码如下:<ListView android:id="@+id/myl

iOS开发UI篇—从代码的逐步优化看MVC

一.要求 要求完成下面一个小的应用程序. 二.一步步对代码进行优化 注意:在开发过程中,优化的过程是一步一步进行的.(如果一个人要吃五个包子才能吃饱,那么他是否直接吃第五个,前面四个不用吃就饱了?) 1.完成基本要求的代码(使用了字典转模型和xib连线) (1)文件结构 (2)主要代码 字典转模型部分: YYappInfo.h头文件 1 // 2 // YYappInfo.h 3 // 12-视图改进(1) 4 // 5 // Created by apple on 14-5-25. 6 //

Android 开发人员必知的50个秘诀、技巧和资源

作者撰写本文的初衷,是为了罗列出Android Studio有用的提示.技巧.快捷方式和参考资源,将提高您的整体效率和操作性能. 显然,还有很多优化.快捷方式等,但作者为了保持这篇文章的简短,限制为50个,希望读者会喜欢这篇文章! (本文是以MacOS X操作Android Studio为例,与Windows / Linux不一致的地方已经标注,请读者注意这一点.) 一.可视化 1.Android Logcat的材料颜色主题(Material Colors theme). 要更改Android

Android开发人员必知的 50 个秘诀、技巧和资源

作者撰写本文的初衷,是为了罗列出Android Studio有用的提示.技巧.快捷方式和参考资源,将提高您的整体效率和操作性能. 显然,还有很多优化.快捷方式等,但作者为了保持这篇文章的简短,限制为50个,希望读者会喜欢这篇文章! 注:本文是以MacOS X操作Android Studio为例,与Windows / Linux不一致的地方已经标注,请读者注意这一点. 可视化 1.Android Logcat的材料颜色主题(Material Colors theme).  要更改Android S

Android开发获取短信的内容并截取短信_Android

1.首先我们要写一个广播接收器,当我们的手机收到短信时,系统会自动发送一个广播,我们只需要接收到这条广播就可以了 2.在广播里面,我们重写的onReceive()方法,通过里面的Intent写到的Bundle就可以拿到短信的内容, 3.清单文件里面我们必须要添加权限,否则无法接收到. 4.为了防止我们的广播接收不到,我们自己写的广播接收器的权限必须要大,以防万一,我设置了1000. 下面上代码,里面的注释也比较详细.. <?xml version="." encoding=&qu