【问题标题】:CursorLoader to query data inside IntentService implementationCursorLoader 在 IntentService 实现中查询数据
【发布时间】:2015-03-01 20:01:03
【问题描述】:

我有一个意图服务,它实际上无限地运行,直到静态 kill Boolean 设置为 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();

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

到目前为止,这种模式似乎正在发挥作用。当我观察的 URI 被删除时,我使用 stopSelf() 退出我的服务。基本上,此服务启动以监视特定 URI 的更改。意图服务的内置队列对我来说真的很有效。 我有两个问题:

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

【问题讨论】:

    标签: java android multithreading android-intentservice


    【解决方案1】:

    这是个好主意吗?

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

    有没有比使用主 Looper 更好的方法来提供处理程序?

    使用普通的Service 并派生出你自己的HandlerThread,然后使用它的Looper。然后你就可以摆脱单独的Executor,并且你仍然不必担心占用主应用程序线程,就像你处理主线程的Looper一样。

    【讨论】:

    • 当我看到你双引号我的 kill boolean 时,我很高兴:D。你的模型看起来更整洁。我会用它。谢谢。很快就会接受。
    猜你喜欢
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    • 2012-12-14
    相关资源
    最近更新 更多