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 个问题:
- 有没有比使用主 Looper 更好的方法来提供处理程序?
如果我使用我的服务线程的处理程序,所有 "messages" 都会在我的服务结束后传递给 onChange (如果我不注销观察者)
- 这个模型合理吗?
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
.
一样
我有一个实际无限运行的意图服务,直到静态 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 个问题:
- 有没有比使用主 Looper 更好的方法来提供处理程序? 如果我使用我的服务线程的处理程序,所有 "messages" 都会在我的服务结束后传递给 onChange (如果我不注销观察者)
- 这个模型合理吗?
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
.