2011-07-22 8 views
4

私は現在、私のアプリケーションを数分間実行した後、 "IllegalStateException could not initカーソルウィンドウ"を受け取っています。私はアプリケーションが起動すると3つの異なるサービスを開始します。それぞれのポーリング(1秒ごとに)が異なるRESTful Webサービスです。結果を取得/解析した後、各サービスにはContentProviderがあり、新しいデータを挿入します。次に、ContentProviderはsetNotificationUriを使用して、現在のアクティビティーに新しいデータがあることを通知します(そのURIから更新を取得するためにサブスクリプションされている場合)。AndroidアプリケーションCursorWindowメモリエラー

これは、RESTfulなWebサービスをポーリングし、その結果を関心のあるアクティビティに得る正しいアプローチですか? this questionの答えを読んだ後は、すべてが同じアプリケーション内にあるため、ContentProviderは不要です。

2番目の質問ですが、IllegalStateExceptionの原因は何ですか?それは、十分なヒープがないことが判明CursorWindow(cursorwindowヒープ割り当てに失敗)を割り当てる。 ContentProviderを照会した後(通知を受け取った後)、カーソルにあまりに多くの結果が返されていた可能性があります。アクティビティは実際に最後の更新が必要なので、ORDER BY "ID" DESCを追加して結果を1に制限しました。したがって、ContentProviderは毎回1つの結果しか返してはいけません。それは実際には何の違いもありませんでした。

最初の質問の助けがあれば、2番目の質問を修正することもできます。アクティビティ内でWebサービスコールを行わないいくつかの場所を読んで、Serviceクラスを使ってWebサービスをポーリングしました。ちょうどFYI、これはいくつかのクライアントしか持たない内部アプリケーションです。

フィードバックありがとうございます。編集

:ここ クエリのいずれかのために必要なコードである:

Cursor geoEllipseDatas = managedQuery(GeoEllipseDataProvider.GEO_ELLIPSE_CONTENT_URI, 
       projection, null, null, GeoEllipseDataProvider.ID + " DESC"); 
     boolean dataAvailable = geoEllipseDatas.moveToLast(); 

if (dataAvailable) { 
    // parse the data out of the cursor 
    String targetId = geoEllipseDatas.getString(1); 
    ... 
} 

答えて

0
  1. 両方のアプローチ(のContentProviderと直接DBアクセス)を行った後、私は個人のContentProviderが少ない供給源であることを見出しましたバグの彼らは本当にコンテンツリゾルバを使って簡単にアクセス/設定することができます。実際にはURIについて考える必要があります。これらのURIのインテントフィルタなど、すべての利点が得られます。

  2. カーソルを正しく閉じて、メモリを解放していることを確認します。コードなしで難しいです。


私はmanagedQueryユースケースを理解するものから、あなたの活動ののonCreateメソッドでそれを呼び出す必要があります。他の場所に呼び出すとstopManagingCursorを呼び出すのが安全だと思います。(この関数が自動的にあなたのために機能するかどうかは分かりませんが、ソースを調べる必要があります)

また、問題はそのフィードバックのためだろう...

+0

おかげでアップデートを、火であろうと、別のクエリをトリガーするであろうと、そのカーソルの更新を発射することを、あなたのコンテンツプロバイダーである可能性があります。私はnumber(1)に同意します。私はあなたがアプリケーションの外部でデータを共有するためにContentProviderだけを使うべきであると読んだとき、ちょっと混乱しました。私は質問にnumber(2)のコードを追加しました。私は "managedQuery"を使用していたので、カーソルを閉じる必要はありませんでした。私は誤った仮定をしたかもしれないように聞こえる? – Sean

+0

答えは上記で編集されました –

関連する問題