访问关闭的光标导致强制关闭

时间:2013-05-29 17:58:06

标签: android cursor

我不确定为什么会发生这种情况,但当我返回某个活动时,我的应用中出现“访问关闭游标”错误。

以下是导致错误的代码:

public class TickClass extends TimerTask
{
    private int columnIndex;

    @Override
    public void run() {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if (_index == 1) {
                    columnIndex = cursor.getColumnIndex(MySQLiteHelper.COLUMN_IMAGE_2);
                    _index = 2;
                }
                else {
                    columnIndex = cursor.getColumnIndex(MySQLiteHelper.COLUMN_IMAGE_1);
                    _index = 1; 
                }   

                String image_1 = cursor.getString(columnIndex);
                image_1 = image_1.replace(".png", "");
                int resourceId = getResources().getIdentifier(getPackageName() + ":drawable/" + image_1, null, null);
                image_1_view.setImageDrawable(getResources().getDrawable(resourceId));
            }
        });
    }
}

更具体地说,String image_1 = cursor.getString(columnIndex);行是Eclipse所说的导致它的行。

现在我有以下代码,用于在活动结束时关闭3个游标:

@Override
protected void onPause() {
    cursor.close();
    cursorCurrent.close();
    cursorPrevious.close();
    datasource.close();
    super.onPause();
}

@Override
public void onDestroy() {
    cursor.close();
    cursorCurrent.close();
    cursorPrevious.close();
    datasource.close();
    super.onDestroy();
}

这是对的吗?我做得不对吗?任何帮助都会很棒。

1 个答案:

答案 0 :(得分:3)

当您关闭onPause()中的游标时,它们将在此之后无法使用。您需要创建新游标才能再次使用它们。

更好的方法是使用CursorLoader以及活动的LoaderManager方法返回的getLoaderManager()。有关如何执行此操作的详细信息,请参阅文档,或查看this tutorial