静的キルブール値がtrueに設定されるか、特定の条件がstopSelf()を呼び出すまで、実質的に無限に実行されるインテントサービスがあります。(これは良い考えですか?) 私のサービスは、コンテンツ プロバイダへのクエリに依存しています。ここで、プロバイダーに変更を「ポーリング」したくなかったので、試しました
getContentResolver().registerContentObserver(uri, false, contentObserver);
ContentObserver を次のように定義します。
private final ContentObserver contentObserver = new ContentObserver(new Handler(Looper.getMainLooper())) {
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
if(kill) {
Log.i("Downloader", "Unregister observer");
getContentResolver().unregisterContentObserver(contentObserver);
return;
}
//Must submit to a thread else, UI gets blocked
executor.execute(updater);
}
};
private final Executor executor = Executors.newSingleThreadExecutor();
「アップデータ」は、私が観察しているオブジェクトを再クエリする単純な Runnable です。
これまでのところ、このモデルは機能しているようです。監視している URI が削除されたら、stopSelf() を使用してサービスを終了します。基本的に、このサービスは特定の URI の変更を監視するために開始されます。インテントサービスの組み込みのキューイングは、私にとって本当にうまくいきます。2 つの質問があります。
- メインの Looper を使用するよりもハンドラーを提供する良い方法はありますか? サービスのスレッドのハンドラーを使用すると、サービスが終了した後にすべての「メッセージ」が onChange に配信されます (オブザーバーの登録を解除しない場合)
- このモデルは賢明ですか?