
但是,与此同时,它可以访问ContentResolver,它允许在其他ContentProvIDers上运行查询.如果需要开发人员为SyncAdapter提供单一内容权限,我无法理解这个特定的设计概念,尽管如此,她仍然能够在她有权访问的任何ContentProvIDer上做任何她想做的事情.我的问题是:忽略onPerformSync的参数有什么后果:字符串权限和ContentProvIDerClIEnt提供程序以及纯ContentResolver?
我的应用程序(实际上是它的SyncService)的想法很简单:查询日历服务器(在我的情况下为OwnCloud)不仅可以获取事件(与com.android.calendar同步),还可以获取VTodoS,然后可以在各种任务管理应用程序之间分配,我可以获取源代码和/或ContentProvIDerContract.我还想到了我自己的“Hub”ContentProvIDer,它具有基本的VTodo / Task结构,并且是与服务器相比唯一的一个.它应该能够与任务管理应用程序的不同内容提供程序同步2路,然后它与服务器同步.
我读过using ContentProviderClient vs ContentResolver to access content provider,我想我明白了它的不同之处.我现在感到困惑的是为什么AndroID SDK中有如此强烈的建议在单个SyncAdapter中使用单个ContentProvIDer但你可以使用ContentResolver来绕过这个限制.
我花了一整天的时间来搞清楚这一点并在此问题上搜索了数百个SO / Google资源(其中一些是多次).我还看到了有关使用一个SyncAdapter来同步多个ContentProvIDers的问题,但没有一个答案与使用ContentResolver的建议相近.
解决方法 在SyncAdapter的上下文中使用时,ContentResolver的API没有特殊限制.恕我直言,框架将ContentProvIDerClIEnt和权限传递给onPerformSync()的唯一原因是方便并且向开发人员提示SyncAdapter的工作方式.这个事实很容易在AbstractThreadedSyncAdapter.SyncThread的源代码中看到 – 传递给onPerformSync()的ContentProvIDerClIEnt是以标准方式获得的:
@OverrIDe public voID run() { Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); // Trace this sync instance. Note,conceptually this should be in // SyncStorageEngine.insertStartSyncEvent(),but the trace functions require unique // threads in order to track overlapPing operations,so we'll do it here for Now. Trace.traceBegin(Trace.TRACE_TAG_SYNC_MANAGER,mAuthority); SyncResult syncResult = new SyncResult(); ContentProvIDerClIEnt provIDer = null; try { if (isCanceled()) { return; } provIDer = mContext.getContentResolver().acquireContentProvIDerClIEnt(mAuthority); if (provIDer != null) { AbstractThreadedSyncAdapter.this.onPerformSync(mAccount,mExtras,mAuthority,provIDer,syncResult); } else { syncResult.databaseError = true; } } finally { Trace.traceEnd(Trace.TRACE_TAG_SYNC_MANAGER); if (provIDer != null) { provIDer.release(); } if (!isCanceled()) { mSyncContext.onFinished(syncResult); } // synchronize so that the assignment will be seen by other threads // that also synchronize accesses to mSyncThreads synchronized (mSyncThreadLock) { mSyncThreads.remove(mThreadsKey); } } } 因此,引导线:您可以根据需要在SyncAdapter中使用ContentResolver – 只需调用getContext().getContentResolver()并访问任何导出的ContentProvIDer.
总结以上是内存溢出为你收集整理的android – 在SyncAdapter中使用ContentResolver而不是ContentProviderClient全部内容,希望文章能够帮你解决android – 在SyncAdapter中使用ContentResolver而不是ContentProviderClient所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)