当前位置: 首页 > 面试题库 >

在Android ContentProvider中从网络同步时防止网络同步循环

方永贞
2023-03-14
问题内容

我正在编写自己的ContentProvider,它将使用SyncAdapter同步到Web服务。

当同步适配器修改内容提供者的数据时,问题会发生,当内部调用getContentResolver()。notifyChange导致同步循环时,提供者触发网络同步。

客户端应用程序进行修改时,需要带有网络同步标志的notifyChange,但在修改同步适配器时应避免使用notifyChange。

在contentprovider内部,如何能够轻松地判断它是由客户端应用程序使用(修改后应触发网络同步)还是由同步适配器(不应触发网络同步)使用。

目前,我正在使用不同的CONTENT_URI(同步适配器使用CONTENT_URI_NO_SYNC访问数据,而客户端应用程序使用CONTENT_URI)来区分两种访问类型,并相应地设置网络同步标志。


问题答案:

观看有关的REST
API使用情况的视频SyncAdapter

他们讨论的方法是向数据库添加一组元数据标志列。这使我们可以做三件事。

  1. 标记本身允许SyncAdapter确定需要更改的行以及这些更改是什么。您如何区分本地创建的行和本地修改的行之间的区别?此外,您如何知道要进行哪个REST API调用?如果您只 删除 一行,那么SyncAdapter如果数据现在消失了,您如何知道要删除的行呢?而是设置“应该删除”标志,然后在SyncAdapter运行时知道将删除推送到服务器。

  2. 这些标志允许您CursorAdapter修改创建的视图(例如添加一个Spinner以显示“此行正在同步”)

  3. 最后,这些 都没有 指出,这些标志使您可以知道为什么要修改该行。如果未设置任何标志并且行发生更改,则 一定 是由于服务器的更新造成的。因此,无需同步到网络。

因此,这两个工作流程如下:

当地变化

  1. 应用程序创建新行。行“创建”标志为true。
  2. ContentProvider存储该行,看到create标志,因此调用 notifyChange(...,true);
  3. 同步到网络= true(最后一个参数)会SyncAdapter触发。
  4. SyncAdapter扫描数据库,找到设置了创建标志的行并执行适当的服务器操作。成功后,SyncAdapter清除该标志。(行更新于ContentProvivder
  5. ContentProvider 看到标志清除,未设置任何标志,因此调用notifyChange(…,false);
  6. ContentObservers查看标志更改,更新为“同步完成”

所有这些步骤对于更新/删除都是等效的-每个创建/更新/删除的每个同步行都有一个标志。还要注意另一个胜利-
如果“创建”暂时失败怎么办?服务器停机…您如何知道重试?-很简单,您无需清除“创建”标志,而是在15分钟后看到它。

远程变更

  1. SyncAdapter 由于定期同步而触发。
  2. SyncAdapter从服务器获取更新。将更改推送到数据库中。不设置任何标志。 ContentProvider看到缺少标志,知道更改一定来自服务器(或者不是数据库更改需要推送到服务器),因此它调用notifyChange(...,false);
  3. ContentObserver看到内容更改,因此它们使用新的行数据进行更新


 类似资料:
  • 本文向大家介绍Android中实现用命令行同步网络时间,包括了Android中实现用命令行同步网络时间的使用技巧和注意事项,需要的朋友参考一下 一、简介 Android基于Linux平台的开源手机操作系统。 二、原理 既然是Linux,那就应该支持linux的各种命令行,高度的可配置,但实验发现Android是Google的一个高度阉割版的linux,很多命令都不支持,如rdate命令(网络同步时

  • 本文向大家介绍Python网络爬虫中的同步与异步示例详解,包括了Python网络爬虫中的同步与异步示例详解的使用技巧和注意事项,需要的朋友参考一下 一、同步与异步 模板 tips: await表达式中的对象必须是awaitable requests不支持非阻塞 aiohttp是用于异步请求的库 代码 gevent简介 gevent是一个python的并发库,它为各种并发和网络相关的任务提供了整洁的

  • 本文向大家介绍C#实现从网络同步标准北京时间的方法,包括了C#实现从网络同步标准北京时间的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#实现从网络同步标准北京时间的方法。分享给大家供大家参考。具体分析如下: 这段C#代码可以从http://www.time.ac.cn网站上获取标准的北京时间,只需简单的组合即可让本地服务器实时同步正确的北京时间 希望本文所述对大家的C#程序设计有

  • Docker 创建网络步骤 Docker是正在发展中的,并会持续提升网络配置的逻辑。当前命令行是很难满足Docker新建容器时所需要的网络配置。 让我们回顾一些基础知识。 通讯的时候使用网际协议(IP),一个机器需要访问至少一个网络接口用来发送和接收包,路由表定义了通过接口可达IP地址范围。网络接口不一定非是物理设备。实际上,在每一个Linux机器(和每个Docker容器内部)的lo回环接口都是有

  • 我正在使用 MVC 4 网络 API,并 asp.net Web 表单 4.0 来构建一个静态 API。它工作得很好: 现在我需要阻止一些属性被序列化。我知道我可以在列表上使用一些LINQ,只获取我需要的属性,通常这是一个很好的方法,但是在目前的场景中,对象太复杂了,我需要在不同的方法中使用不同的属性集,所以在运行时更容易标记要忽略的每个属性。 有没有办法做到这一点?

  • 如题,面试的时候被问到了这个问题。 我只回答了binlog,可以根据offset或gtid进行同步,不知道有没有回答到重点上