2

フラグメント内の要素のリストを表示するために、カスタム コンテンツ プロバイダーと 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 呼び出しを再度実行したいのですが、何が欠けていますか?

よろしくお願いします。

4

1 に答える 1