1

在我的应用程序中,我收到有关仅在摩托罗拉手机上出现的零星光标错误的报告。我正在使用由 SQLite 查询支持的 ListView 来查看目录,并且在远程或本地更新目录时会刷新查询。

我们看到的最常见的错误是:

  • java.lang.IllegalStateException: 这应该只在游标有效时调用
  • java.lang.IllegalStateException:光标已关闭
  • android.database.StaleDataException:访问关闭游标
  • java.lang.IllegalStateException:尝试重新打开一个已经关闭的对象:android.database.CursorWindow

这是一个已知问题,是否有修复或解决方法?

我使用 AsyncTask 更新列表:

private class RefreshTask extends AsyncTask<Void, Void, Cursor> {
    protected Cursor doInBackground(Void... params) {
        return ReaderHelper.getItemCursor(getActivity(), ReaderHelper.itemFilter);
    }           

    protected void onPostExecute(Cursor csr) {
        int count = csr.getCount();
        loadingBar.setVisibility(View.GONE);
        if (count == 0) {
            if (ReaderHelper.itemFilter.unread) emptyMessage.setText(getText(R.string.msg_no_item_unread));
            else emptyMessage.setText(getText(R.string.msg_no_item));
        }

        mCursor = csr;
        getActivity().startManagingCursor(mCursor);
        mAdapter.changeCursor(mCursor);

    }   
}   

这是适配器。

private class ItemsAdapter extends ResourceCursorAdapter {
    private ItemsAdapter(Context c, Cursor csr) {
        super(c, R.layout.item_list_row, csr, false);
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        View view = super.newView(context, cursor, parent);
        view.setTag(new ItemViewHolder());
        return view;
    }

    @Override
    public void bindView(View v, Context c, Cursor csr) {
        ...
    }
}
4

1 回答 1

0

仍然没有足够的代码让读者理解你在做什么——特别是,你没有展示RefreshTask是如何创建的。但我注意到它RefreshTask正在引用一个活动,大概是创建它的活动。如果 Activity 在RefreshTask执行时被销毁,这可能会导致问题。

与其直接更新 Activity,不如重写Application类,并将刷新状态放在那里。(有关示例,请参阅此答案此答案有另一个示例,并且还显示了应用程序清单所需的更新。)

请注意,如果您走这条路线,则不应让 Activity 管理光标。相反,在 onPostExecute 中,您可以将游标数据转储到存储在 Application 对象中的数组中。

于 2011-06-28T16:42:37.433 回答