[Android随笔]内存优化纪录篇

来源:互联网 发布:郭德纲相声知乎 编辑:程序博客网 时间:2024/06/06 05:51

    一些常见的MemoryLeak分析,平时自己代码中也注意使用。

1,大量的使用static关键字修饰

    static是个好东西,声明赋值调用就是那么的简单方便,但是伴随而来的还有性能问题。由于static声明变量的生命周期其实是和APP的生命周期一样的,有点类似与Application。如果大量的使用的话,就会占据内存空间不释放,积少成多也会造成内存的不断开销,直至挂掉。static的合理使用一般用来修饰基本数据类型或者轻量级对象,尽量避免修复集合或者大对象,常用作修饰全局配置项、工具类方法、内部类。

2,Bitmap的使用

    2.1 Bitmap处理不当极可能造成OOM,绝大多数情况应用程序OOM都是因这个原因出现的。Bitmap在被创建使用后,由于Dalivk并不会主动的去回收,需要开发者在Bitmap不被使用的时候recycle掉。

    2.2 同时还有种情况则是加载大图片,如果需求允许,可以对图片进行一定的缩放,通过BitmapFactory.Options的inSampleSize属性控制。

    2.3 使用LruCache内存缓存以及DiskLruCache硬盘缓存方法来加载和显示图片。

    2.4 使用android-universal-imageLoader或者xUtils第三方开源库。

   后期个人分析篇《Android基础》

3,Cursor及时关闭

    在查询SQLite数据库时,会返回一个Cursor,当查询完毕后,调用cursor.close()及时关闭,这样就可以把查询结果集及时给回收掉。

4,I/O流

     I/O流操作完毕,读写结束,及时关闭。

5,ListView和GridView的Item的缓存

    在ListView和GridView中,列表中的很多项(convertView)是可以重用的,不需要每次getView就重新生成一项。另外,页面的绘制其实是很耗时的,findViewById也比较慢。所以不重用View,在有列表的时候就尤为显著了,经常会出现滑动很卡的现象。

    可以参考《ViewHolder的用法》示例代码如下:

    

public class FileListAdapter extends BaseAdapter{    private final Context mContext;    private final ArrayList<String> mList;    public FileListAdapter(Context context, ArrayList<String> list) {        mContext = context;        mList = list;    }    @Override    public int getCount() {        return mList.size();    }    @Override    public Object getItem(int position) {        return mList.get(position);    }    @Override    public long getItemId(int position) {        return position;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        ViewHolder holder = null;        if (convertView == null){            holder = new ViewHolder();            LayoutInflater inflater = LayoutInflater.from(mContext);            convertView  =  inflater.inflate(R.layout.list_item, null);            holder.imagView = (ImageView)convertView.findViewById(R.id.imageView);            holder.textView = (TextView)convertView.findViewById(R.id.textView);            convertView.setTag(holder);        }else {            holder = (ViewHolder) convertView.getTag();        }        holder.imagView.setBackgroundResource(R.mipmap.ic_launcher);        holder.textView.setText(mList.get(position));        return convertView;    }     class ViewHolder {        public ImageView imagView;        public TextView textView;    }}


6,String、StringBuilder、StringBuffer

    当有较多的字符串需要拼接操作的时候,使用StringBuilder或者StringBuffer,如果不考虑线性安全的情况下,推荐使用String Builder。

7,Handler清理

    在处理异步操作的时候,handler + thread是个不错的选择。但是相信在使用handler的时候,大家都会遇到警告的情形,这个就是lint为开发者的提醒。handler运行于UI线程,不断处理来自MessageQueue的消息,如果handler还有消息需要处理但是Activity页面已经结束的情况下,Activity的引用其实并不会被回收,这就造成了内存泄漏。解决方案,一是在Activity的onDestroy方法中调用handler.removeCallbacksAndMessages(null);取消所有的消息的处理,包括待处理的消息;

8,页面背景图

    在布局和代码中设置背景和图片的时候,如果是纯色,尽量使用color;如果是规则图形,尽量使用shape画图;如果稍微复杂点,可以使用9patch图;如果不能使用9patch的情况下,针对几种主流分辨率的机型进行切图。如果ImageView的背景图是会变化的,则在布局文件xml中不添加android.src=""属性,而是在代码中设置背景资源图。


0 0