0

静的キルブール値が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 つの質問があります。

  1. メインの Looper を使用するよりもハンドラーを提供する良い方法はありますか? サービスのスレッドのハンドラーを使用すると、サービスが終了した後にすべての「メッセージ」が onChange に配信されます (オブザーバーの登録を解除しない場合)
  2. このモデルは賢明ですか?
4

1 に答える 1

0

これは良い考えですか?

私見、いいえ。通常のスレッドを使用してService、独自のバックグラウンド スレッドを管理します。次に、「静的な kill ブール値」の代わりにstopService()、または を介し​​てサービスに配信されるメッセージを使用します。startService()

メインの Looper を使用するよりもハンドラーを提供する良い方法はありますか?

通常の を使用しService、独自の をフォークしてHandlerThreadから、その を使用しLooperます。その後、個別の を取り除くことができますがExecutor、メイン スレッドのLooper.

于 2015-03-01T20:15:21.150 に答える