0

サービスの構成データを保持するテーブルを更新するアクティビティがあります。SimpleCursorLoader と SupportLoaderManager を使用して、そのアクティビティのリストビューを更新しています。アクティビティの onDestroy でローダーを破棄します。私が見ている問題は、このアクティビティにアクセスしなくても発生するため、関係ない可能性があります。

上記のアクティビティで変更されたテーブルへの URI に ContentObserver を登録するサービスもあります。構成を読み取り、それ自体をセットアップして、Service の onCreate のそのテーブルに ContentObserver を登録します。サービスの onDestroy では、そのリスナーは登録解除されています。

これは、システムにあるいくつかのデータベース/テーブルの 1 つにすぎません。私が見ているのは、まったく別のテーブルを更新すると、この構成 URI の ContentObserver がトリガーされていることです。オーソリティはまったく異なり、さまざまな SqlLite データベースと対話し、アプリケーション内のさまざまなプロセスで実行されています。ContentObservers をトリガーする可能性のある "notifyChange" 呼び出しをすべて削除しましたが、まだ起動しています。

私の質問は、ContentObserver を起動させている notifyChange を誰が呼び出しているかを調べる方法はありますか? アプリケーションの外部のシステムには、オブザーバーに URI を通知する理由がありますか? 私はそれを追跡しようとしていますが、通知がどこから来ているのか手掛かりがなく、壁にぶつかっています.

4

1 に答える 1

0

繰り返しますが、答えからわずか数時間です。私のコードでは、notifyChange 呼び出しのすべてが見つからなかったようです。犯人は:

getContentResolver.notifyChange(new Uri.Builder().build(), null);

これは、空の Uri で通知を呼び出していました。ドキュメントには記載されていないようですが、私が見た動作は、これにより登録済みのすべての ContentObservers がアプリケーションで起動されるというものでした。そこからその行を取得しましたが、今ではすべてが正常に通知されています。

私の最初の質問「Uri で notifyChange を呼び出した人を見つける方法はありますか?」に対する答えは、「あなたのコードでの notifyChange の呼び出しをもっとよく見てください。それ以外は、あなた次第です」と思います。 ."

于 2013-03-15T15:32:47.617 に答える