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