你可以使用一个服务的LoaderManager?
我有一个数据加载系统build立使用自定义加载程序和游标,从活动和片段很好的工作,但没有LoaderManager(我可以find)在服务。 有谁知道为什么LoaderManager被排除在服务之外? 如果不是有解决这个问题的方法吗?
有谁知道为什么LoaderManager被排除在服务之外?
正如在另一个答案中所述, LoaderManager
被明确地devise成通过Acivities
和Fragments
的生命周期来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()方法。