首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

在ListFragment中使用CursorAdapter造成的内存泄露有关问题

2012-09-20 
在ListFragment中使用CursorAdapter造成的内存泄露问题今天在项目中被一个OutOfMemoryError问题困扰了很久

在ListFragment中使用CursorAdapter造成的内存泄露问题
今天在项目中被一个OutOfMemoryError问题困扰了很久,找了半天才发现是由于在ListFragment中使用CursorAdpater造成了内存泄露,横竖屏的时候每倒一次内存就少几兆,几次之后就会出现OutOfMemoryError,具体原因没去深究
于是想干脆把所有的CursorAdapter都换成BaseAdapter,然后自己在其内部封装一个Cursor来实现,但是这样一搞,以前写的所有Adapter都要得重新写一遍,这工作量有点大了···
这时突然想到CursorAdapter也是继承于BaseAdapter,然后去看了下CursorAdapter的源代码,想到个办法,干脆将其中的很多用不到的代码全部去掉,自己来写了一个精简版的CursorAdapter,取个名字叫CustomCursorAdapter.java
再然后把原来所有继承CursorAdapter的类直接换成CustomCursorAdapter,这样一搞居然还真把问题给解决了,现在不管屏幕翻转多少次,都不会再出现OutOfMemoryError!

CustomCursorAdapter.java

import android.content.Context;import android.database.Cursor;import android.provider.BaseColumns;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;public abstract class CustomCursorAdapter extends BaseAdapter {    protected Context mContext;    private Cursor mCursor;    public CustomCursorAdapter(Context context, Cursor cursor, int flag) {        this(context, cursor);    }    public CustomCursorAdapter(Context context, Cursor cursor) {        if (context == null) {            throw new NullPointerException("context should not be null");        }        this.mContext = context;        this.mCursor = cursor;    }    @Override    public int getCount() {        if (mCursor != null) {            return mCursor.getCount();        } else {            return 0;        }    }    @Override    public Object getItem(int position) {        if (mCursor != null) {            mCursor.moveToPosition(position);            return mCursor;        } else {            return null;        }    }    @Override    public long getItemId(int position) {        if (mCursor != null) {            if (mCursor.moveToPosition(position)) {                return mCursor.getLong(mCursor.getColumnIndexOrThrow(BaseColumns._ID));            } else {                return 0;            }        } else {            return 0;        }    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        if (!mCursor.moveToPosition(position)) {            throw new IllegalStateException("couldn't move cursor to position " + position);        }        View v;        if (convertView == null) {            v = newView(mContext, mCursor, parent);        } else {            v = convertView;        }        bindView(v, mContext, mCursor);        return v;    }    public abstract View newView(Context context, Cursor cursor, ViewGroup view);    public abstract void bindView(View view, Context context, Cursor cursor);    public Cursor getCursor() {        return mCursor;    }}

热点排行