2011-06-28 9 views
1

私のアプリでは、Motorolaの携帯電話にしか現れない散発的なカーソルエラーの報告を受けています。私は、ディレクトリを表示するためにSQLiteクエリによってバックアップされたListViewを使用しており、ディレクトリがリモートまたはローカルに更新されたときにクエリがリフレッシュされます。私たちが見るMotorolaの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がアクティビティ、おそらくそれを作成したアクティビティを参照していることに気付きました。 RefreshTaskの実行中にアクティビティが破棄されると、問題が発生する可能性があります。

アクティビティを直接更新する代わりに、おそらくApplicationクラスをオーバーライドして、リフレッシュされた状態をそこに置く必要があります。 (例としてthis answerを参照してください; this answerにはもう1つの例があり、アプリケーションのマニフェストに必要な更新も表示されます)

このルートに行く場合は、アクティビティにカーソルを管理しないでください。代わりに、onPostExecuteで、カーソルデータをApplicationオブジェクトに格納されている配列にダンプすることができます。

+0

あなたのヒントをありがとう。 getActivity()の代わりに何を使うべきですか? getActivity()。getApplicationContext()は大丈夫ですか? – user579619

+0

@ user579619:RefreshTaskクラスのコンストラクタを表示すると本当に役に立ちます。しかし、あなたの質問に答えてみてください:** getActivity()を呼び出さないでください。代わりに、アプリケーションをコンストラクターのパラメーターとしてRefreshTaskに渡します。 –

+0

RefreshTaskのコンストラクタはありません。私はちょうど新しいRefreshTask()を呼び出します。実行します。モトローラデバイスを除くすべてのデバイスで動作します。このエラーは、CursorApdapterがgetView()を開始したときに常に表示されます。java.lang.IllegalStateException:これはカーソルが有効なときにのみ呼び出されるべきです – user579619

関連する問題