你可以使用一个服务的LoaderManager?

我有一个数据加载系统build立使用自定义加载程序和游标,从活动和片段很好的工作,但没有LoaderManager(我可以find)在服务。 有谁知道为什么LoaderManager被排除在服务之外? 如果不是有解决这个问题的方法吗?

有谁知道为什么LoaderManager被排除在服务之外?

正如在另一个答案中所述, LoaderManager被明确地devise成通过AcivitiesFragments的生命周期来pipe理Loaders 。 由于Services没有这些configuration更改来处理,使用LoaderManager是没有必要的。

如果不是有解决这个问题的方法吗?

是的,诀窍是你不需要使用一个LoaderManager ,你可以直接使用你的Loader ,它将处理asynchronous加载你的数据和监视你的任何潜在的数据变化,这比手动查询你的数据要好得多。

首先,在创buildService时创build,注册并开始加载Loader

 @Override public void onCreate() { mCursorLoader = new CursorLoader(context, contentUri, projection, selection, selectionArgs, orderBy); mCursorLoader.registerListener(LOADER_ID_NETWORK, this); mCursorLoader.startLoading(); } 

接下来,在你的Service实现OnLoadCompleteListener<Cursor>来处理负载callback。

 @Override public void onLoadComplete(Loader<Cursor> loader, Cursor data) { // Bind data to UI, etc } 

最后,当Service被破坏时不要忘记清理你的Loader

 @Override public void onDestroy() { // Stop the cursor loader if (mCursorLoader != null) { mCursorLoader.unregisterListener(this); mCursorLoader.cancelLoad(); mCursorLoader.stopLoading(); } } 

很不幸的是,不行。 装载机是为活动和碎片devise的,以便干净地处理Activites和Fragments中发生的configuration变化。 即旋转您的设备并重新附加到现有的数据。

服务没有任何configuration更改,它将一直保留在后台直到完成或系统被强制终止。 所以假设你在你的服务的后台线程上执行你的代码(你应该是这样的),那么就没有理由使用Loader。 只需拨打您需要的电话来查询您的数据。

所以如果你的服务只是一个IntentService,你可以写你的逻辑来查询你的游标支持的数据在onHandleIntent()方法。

http://developer.android.com/guide/components/loaders.html