2011-06-28 24 views
1

在我的应用程序中,我收到只在摩托罗拉手机上出现的零星游标错误报告。我正在使用由SQLite查询支持的ListView查看目录,并且在远程或本地更新目录时刷新查询。在摩托罗拉Android设备上崩溃

我们看到

最常见的错误是:

  • 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) { 
     ... 
    } 
} 
+0

没有发布你的代码,很难得到一个好的解决方案。 –

回答

0

仍然没有足够的代码,使读者了解你在做什么 - 尤其是你不显示怎么RefreshTask创建。但我注意到RefreshTask引用了一个Activity,可能是创建它的Activity。如果在执行RefreshTask时活动被破坏,这可能会导致问题。

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

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

+0

感谢您的提示。我应该用什么来代替getActivity()?是getActivity()。getApplicationContext()好吗? – user579619

+0

@ user579619:如果您要显示RefreshTask类的构造函数,这将非常有帮助。但要尝试回答你的问题:不要调用'getActivity()',或者从** RefreshTask **中对Activity执行任何操作。相反,将应用程序作为参数传递给构造函数中的RefreshTask。 –

+0

没有RefreshTask的构造函数。我只是调用新的RefreshTask()。execute。它适用于所有设备,但摩托罗拉设备。当CursorApdapter启动getView()时,总会出现这个错误:java.lang.IllegalStateException:只有当光标有效时才会调用这个错误 – user579619