草庐IT

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

coder 2023-08-29 原文

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

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

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

在内容提供者内部,如何轻松判断它是由客户端应用程序(应在修改时触发网络同步)还是由同步适配器(不应触发网络同步)使用。

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

最佳答案

观看this video关于 SyncAdapter 中 REST API 的使用。

他们讨论的方法是在数据库中添加一组元数据标志列。这允许我们做 3 件事。

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

  2. 标志允许您的 CursorAdapter 修改创建的 View (如添加 Spinner 以显示“此行正在同步”)

  3. 最后,他们没有指出的是,标志允许您告诉为什么要修改该行。如果未设置任何标志并且行发生更改,则一定是由于服务器更新所致。因此,无需同步到网络。

所以,两个工作流程如下:

本地变化

  1. 应用创建新行。行“创建”标志为真。
  2. ContentProvider 存储该行,查看创建标志并调用 notifyChange(...,true);
  3. Sync to network = true(最后一个参数)导致 SyncAdapter 触发。
  4. SyncAdapter 扫描数据库,找到设置了创建标志的行并执行适当的服务器操作。成功后,SyncAdapter 清除标志。(ContentProvivder 上的行更新)
  5. ContentProvider 看到标志已清除,没有留下任何标志,因此它调用 notifyChange(...,false);
  6. ContentObserver看到标志变化,更新看起来像“同步完成”

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

远程更改

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

关于java - 在 Android ContentProvider 中从网络同步时防止网络同步循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6588770/

有关java - 在 Android ContentProvider 中从网络同步时防止网络同步循环的更多相关文章

  1. ruby - 树顶语法无限循环 - 2

    我脑子里浮现出一些关于一种新编程语言的想法,所以我想我会尝试实现它。一位friend建议我尝试使用Treetop(Rubygem)来创建一个解析器。Treetop的文档很少,我以前从未做过这种事情。我的解析器表现得好像有一个无限循环,但没有堆栈跟踪;事实证明很难追踪到。有人可以指出入门级解析/AST指南的方向吗?我真的需要一些列出规则、常见用法等的东西来使用像Treetop这样的工具。我的语法分析器在GitHub上,以防有人希望帮助我改进它。class{initialize=lambda(name){receiver.name=name}greet=lambda{IO.puts("He

  2. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  3. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  4. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  5. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  6. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  7. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  8. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  9. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  10. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

随机推荐