Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于在IntentService实现中查询数据的游标加载程序_Java_Android_Multithreading_Android Intentservice - Fatal编程技术网

Java 用于在IntentService实现中查询数据的游标加载程序

Java 用于在IntentService实现中查询数据的游标加载程序,java,android,multithreading,android-intentservice,Java,Android,Multithreading,Android Intentservice,我有一个intent服务,它实际上是无限运行的,直到一个静态kill布尔值被设置为true或某个特定条件调用stopSelf()。(这是个好主意吗?) 我的服务依赖于查询内容提供商。 现在,我不想“轮询”提供商的更改,所以我尝试了 getContentResolver().registerContentObserver(uri, false, contentObserver); 我对ContentObserver的定义如下: private final ContentObserver cont

我有一个intent服务,它实际上是无限运行的,直到一个静态kill布尔值被设置为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”是一个简单的可运行程序,它可以重新查询我正在观察的对象

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

  • 有没有比使用主循环器更好的方法来提供处理程序? 如果我使用我的服务线程的处理程序,那么在我的服务终止后,所有的“消息”都会传递到onChange(如果我没有注销观察器)
  • 这种模式合理吗
  • 这是个好主意吗

    不,请使用常规的
    服务
    并管理您自己的后台线程。然后使用
    stopService()
    ,或通过
    startService()
    传递到服务的消息,而不是“静态终止布尔值”

    有没有比使用主循环器更好的方法来提供处理程序


    使用常规的
    服务
    和自己的叉子,然后使用它的
    活套
    。然后,您可以摆脱单独的
    执行器
    ,并且您仍然不必担心主应用程序线程被捆绑,就像您使用主线程的
    活套

    一样。当我看到您双引号引用我的kill布尔值:D时,我大笑起来。您的模型看起来更整洁了。我会用的。谢谢我很快就会接受的。