在我的应用程序上,我收到的报告显示偶尔出现在摩托罗拉手机上的游标错误。我使用由SQLite查询支持的ListView来查看目录,并在远程或本地更新目录时刷新查询。
我们看到的最常见的错误是:
这是一个已知问题,是否有修复或解决方法?
我使用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) {
...
}
}
答案 0 :(得分:0)
仍然没有足够的代码让读者了解您正在做的事情 - 特别是,您没有展示如何创建RefreshTask
。但是我注意到RefreshTask
引用了一个Activity,可能是创建它的Activity。如果在RefreshTask
执行期间销毁活动,这可能会导致问题。
您可以覆盖Application类,并将刷新状态放在那里,而不是直接更新Activity。 (有关示例,请参阅this answer; this answer还有另一个示例,还显示了应用程序清单所需的更新。)
请注意,如果您选择此路线,则不应让活动管理光标。相反,在onPostExecute中,您可以将游标数据转储到存储在Application对象中的数组中。