CursorLoader 在 IntentService 实现中查询数据

CursorLoader to query data inside IntentService implementation

我有一个实际无限运行的意图服务,直到静态 kill 布尔值设置为真或某些特定条件调用 stopSelf()。 (这是一个好主意吗 ?) 我的服务取决于查询内容提供者。 现在我不想 "poll" 提供商进行更改,所以我尝试了

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();

"updater" 是简单的 Runnable,它重新查询我正在观察的对象。

到目前为止,这个模型似乎很有效。当我正在观察的 URI 被删除时,我使用 stopSelf() 退出我的服务。基本上这个服务是为了监视特定 URI 的变化而启动的。意图服务的内置排队真的很适合我。 我有 2 个问题:

  1. 有没有比使用主 Looper 更好的方法来提供处理程序? 如果我使用我的服务线程的处理程序,所有 "messages" 都会在我的服务结束后传递给 onChange (如果我不注销观察者)
  2. 这个模型合理吗?

is this a good idea ?

恕我直言,没有。使用常规 Service 并管理您自己的后台线程。然后使用 stopService(),或通过 startService() 传递给服务的消息,而不是 "a static kill Boolean"。

Is there a better way to supply a handler than using the main Looper ?

使用常规 Service 并分叉您自己的 HandlerThread,然后使用它的 Looper。然后你可以摆脱单独的Executor,你仍然不必担心占用主应用程序线程,就像主线程的Looper.

一样