フラグメント内の要素のリストを表示するために、カスタム コンテンツ プロバイダーと CursorLoader を使用しています。
まず、CursorLoader が ContentProvider の query() を呼び出して、データベースに格納されているすべての要素を取得します。私の query() 関数では、WebService 呼び出しを実行してデータベース内の要素を更新するスレッドを開始します。スレッドは WebServices の応答を解析し、ContentProviders の bulkInsert() を呼び出しています。
bulkInsert() が完了したら、notifyChange() を呼び出します。
ここで何が起こっているのか: notifyChange() の後、ContentProvider の query() メソッドが再度呼び出され、新しい WebService 呼び出しなどにつながることがわかります。
ここで ContentProvider の query() メソッド:
...
// Database query
ticketCursor = mDb.query(TBL_TICKET_NAME, projection, selection, selectionArgs, null, null, orderBy);
// set Notification URI
ticketCursor.setNotificationUri(getContext().getContentResolver(), TICKET_CONTENT_URI);
// WebService call --> This starts a new Thread for the WebService call
asyncSoapQuery(where, uri);
return ticketCursor;
私のbulkInsertメソッドは次のようになります:
mDb.beginTransaction();
for (ContentValues value : values) {
mDb.insertWithOnConflict(table, null, value, SQLiteDatabase.CONFLICT_REPLACE);
}
mDb.setTransactionSuccessful();
getContext().getContentResolver().notifyChange(TICKET_CONTENT_URI, null);
mDb.endTransaction();
return values.length();
したがって、私の問題は、これにより Web サービス呼び出しの無限ループが発生することです。私は、notifyChange() がコンテンツ プロバイダーの query() メソッドを再度呼び出していないと考えました。ユーザーが UI で「更新」を押した場合にのみ、query() 内で WS 呼び出しを再度実行したいのですが、何が欠けていますか?
よろしくお願いします。