在摩托罗拉Android设备上崩溃

时间:2011-06-28 15:31:56

标签: android database sqlite motorola

在我的应用程序上,我收到的报告显示偶尔出现在摩托罗拉手机上的游标错误。我使用由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) {
        ...
    }
}

1 个答案:

答案 0 :(得分:0)

仍然没有足够的代码让读者了解您正在做的事情 - 特别是,您没有展示如何创建RefreshTask。但是我注意到RefreshTask引用了一个Activity,可能是创建它的Activity。如果在RefreshTask执行期间销毁活动,这可能会导致问题。

您可以覆盖Application类,并将刷新状态放在那里,而不是直接更新Activity。 (有关示例,请参阅this answer; this answer还有另一个示例,还显示了应用程序清单所需的更新。)

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