Android 离线请求与 Volley

2024-02-19

我想为我的用户提供更好的离线用户体验,因此,我想构建一个Service它存储所有POST, DELETE, PUT (GET没有意义,因为GET没有网络的调用是缓存调用)用户离线执行的请求,并在用户获得互联网连接后立即将其发送到服务器。我希望它是持久的:即使应用程序被终止,也会发送数据,以免缓存和服务器数据之间出现不一致。

我非常熟悉 Google Volley 和 Android Networking API --> 我知道如何检测没有网络,如何预取数据,缓存它们等等......

但是有关于这个主题的要点或图书馆吗?我知道最新的 Facebook 版本实现了这样的系统,但我想知道他们是如何做到的(我的意思是,我知道他们正在使用一个Service但他们到底是怎么做的,我不知道!)。有人对此有想法吗?有经验吗?


您需要使用 BroadcastReceiver 来监听网络变化事件。使用以下操作在 AndroidManifest.xml 中定义广播接收器。

<receiver android:name=".NetworkBroadcastReceiver" >
     <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
     </intent-filter>
</receiver>

还将以下权限添加到您的清单文件中 -

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />

网络广播接收器 -

public class NetworkBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(final Context context, final Intent intent) {

        if(isInternetConnected(context)) {
            //Do something i.e. trigger an API call or start a IntentService etc.
        }    
    }


    public boolean isInternetConnected(Context context) {
        ConnectivityManager connectivityManager 
            = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        return activeNetworkInfo != null && activeNetworkInfo.isConnected();
    }    
}

这就是您在接入互联网后立即发出请求所需要做的全部工作。

要缓存数据,我建议您解析服务器响应并将其保存在数据库中以供离线使用。每次成功发出请求时,都会将新数据保存在数据库中并丢弃旧数据。当用户启动应用程序时,首先从数据库加载数据,然后触发 Volley 请求,如果请求成功,则在应用程序中加载新数据,将其存储在数据库中并删除旧数据。因此,如果请求失败,用户仍然可以看到之前成功请求的旧数据。

为了处理应用程序和服务器中数据不一致的情况,您需要使用SyncAdapter。 SyncAdapter 为后台定期同步提供了很好的支持。只需将同步代码放在 SyncAdapter 的 onPerformSync() 方法中即可。它可能在以下两种情况下不起作用 - 1. 如果用户未连接到互联网 2. 如果用户设备已关闭

要处理这些情况,请使用我在上面的答案中解释的 BroadCastReceiver 来触发 SyncAdapter。还将以下操作添加到 AndroidManifest.xml 中的接收器中,以侦听设备的启动完成事件。

<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />

如果您需要通过编码示例进行更深入的解释,请告诉我。希望能帮助到你

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 离线请求与 Volley 的相关文章

随机推荐

  • JavaScript 按钮样式单击时更改

    我已经将这段 JavaScript 放在一起 但由于我是新手 所以我在代码上遇到了困难 我想要做的是 当单击按钮时 它将更改背景颜色的不透明度 下面的代码执行此操作 但现在我希望再次单击按钮时将其恢复到正常状态 我怎样才能做到这一点 谢谢
  • getter 和 setters 不工作目标 c

    我不能在 Objective C 中这样做吗 interface Foo NSObject int apple int banana property int fruitCount end implementation Foo synthe
  • 当我的编译器告诉我正在使用不安全或未经检查的操作时,这意味着什么?

    我的程序编译得很好 但我的控制台输出以下内容 jGRASP exec javac g CreditGraphics java Note CreditGraphics java uses unchecked or unsafe operati
  • 当存在调试代码时如何禁止 git 提交

    我有一些调试代码 我想确保我不会提交到 Git 就像是 void myImportantFunction while true MyCode ifndef NDEBUG TODO remove before commit std this
  • yytext[0]是什么意思?

    yytext 0 是什么意思 为什么我们要在 lex 和 yacc 程序中使用 我是学习者 所以不要介意这是一个愚蠢的问题 yytext 保存与当前标记匹配的文本 因此 yytext 0 保存与当前标记匹配的文本的第一个字符 有时您有一个可
  • 将文本字段的输入存储在 PHP 变量中[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 将用户从文本字段输入的内容存储在变量
  • “?”有什么作用?意思是下面的语句

    请原谅我的 新手 问题 但是问号 到底是什么 下面这行代码的意思是 self navigationItem leftBarButtonItem title editing NSLocalizedString Done Done NSLoca
  • 设置 (M x N x N) 矩阵对角线的快速方法? Einsum / n 维 fill_diagonal?

    我正在尝试编写基于矩阵的快速 优化的代码 并且最近发现 einsum 作为实现显着加速的工具 是否可以使用它来有效地设置多维数组的对角线 或者它只能返回数据 在我的问题中 我尝试通过对每个方阵 N x N 矩阵中的列求和来设置方阵数组 形状
  • 使用 mapply cbind 两个列表中的元素

    如果我有两个清单 L1 lt list a1 a2 a3 L2 lt list b1 b2 b3 获取新列表的最佳方式是什么 L3 lt list c1 c2 c3 使得 c1 lt cbind a1 b1 c2 lt cbind a2 b
  • 如何在 XSL 中使用 count() 函数 - 尝试计算报告中“A”的数量

    我正在尝试计算数量A 学校报告里有吗 这是报告
  • 使用根 CA 签名者生成自签名证书

    场景 我正在使用 PowerShellWindows Server 2012r2生成根证书并希望使用它在动态生成 和销毁 的开发 测试环境中签署新创建的中间证书和 Web 证书 这些脚本是远程部署的 目的是尽可能保持纯 PowerShell
  • Android IAP的Java服务器端验证

    我想通过我的中央游戏服务器上的 Google API 验证 Android IAP 有很多关于此的部分信息 这让我大吃一惊 我还没有支付 25 欧元成为 Google 开发者 因为我不确定我是否能够让它发挥作用 进行 IAP 时 会返回一个
  • 将 PHP 对象传递给 javascript [重复]

    这个问题在这里已经有答案了 我在 php 中有对象 每个对象代表一个 项目 以及与其关联的所有信息 当用户浏览页面时 这些对象应该传递给javascript 理想情况下 镜像相同的结构 这样我就可以使用 Raphael 在我的网站上将每个项
  • NHibernate 防止延迟加载不匹配的引用

    我对 NHibernate 有很大的疑问 我有从 Table1 到 Table2 的引用 并且我希望 NHibernate 在 Table2 中找不到相应记录时 不要针对 Table2 发出 SELECT 语句 我不知道 要确保它实际上不在
  • Android:在服务类中读取NFC标签

    我正在开发一个应用程序 我需要读取存储在 NFC 标签中的数据 我所说的数据是指简单的整数值 例如 0 1 2 3 等 从 NFC 读取数据的功能在 Activity 类中工作正常 但我需要在后台运行应用程序 因此即使应用程序未在前台运行
  • 如何在 Microsoft Surface 上自动化非交互式测试

    我们有一套测试 本机库的测试用例 我们希望在 Microsoft Surface ARM 版本 上运行 从 Visual Studio 中手动完成此操作很容易 然而 我们希望以一种可以编译 安装 运行和收集命令行输出 例如来自 Jenkin
  • 未处理的异常:PlatformException(通道错误,无法在通道上建立连接。,null,null)

    突然这个错误出现在调试控制台中 我不知道我做错了什么 您已经升级了 Flutter 但没有升级软件包 在终端中输入 flutter pub outdated 然后将过时的软件包一一升级 如下所示 flutter pub upgrade ou
  • 为什么 Devise 的“current_user”在模型层不可用?

    有很多关于 Devise 的帖子以及缺乏在模型中使用的 current user 的可用性 这里和其他地方发布了许多解决方法 然而 我在任何帖子中都没有找到 为什么 的答案 这是安全问题吗 如果没有 为什么 由于您无权访问模型内 的会话变量
  • Java 构造函数重载

    我是 Java 新手 我无法理解构造函数问题 我已经看过很多教程 但我仍然很难理解为什么我们使用构造函数 无论如何 我的具体问题是 如果我错了 请纠正我 如果我想在我的类中添加多个构造函数 我将编写第一个 第二个将是int类型 在括号内 是
  • Android 离线请求与 Volley

    我想为我的用户提供更好的离线用户体验 因此 我想构建一个Service它存储所有POST DELETE PUT GET没有意义 因为GET没有网络的调用是缓存调用 用户离线执行的请求 并在用户获得互联网连接后立即将其发送到服务器 我希望它是