将 REST 调用与“Activity”分离的最佳方法

2024-01-15

我正在使用 Retrofit,并希望当用户在我的活动之间导航时 REST 调用能够继续存在(而不是仅在配置更改时保留它们)。几个选项:

  1. 改进同步调用AsyncTask并将其放入保留的“任务片段” http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html
  2. 改进同步调用IntentService并广播 https://developer.android.com/training/run-background-service/create-service.html
  3. Google suggests http://developer.android.com/training/volley/requestqueue.html#singleton每个应用程序的单例,至少对于 Volley 来说......

最好的方法是什么?我可以将 RxJava 视为一种改造模式,但即使有,也只是建议“取消订阅返回的Observable in onDestroy最迟” - 所以这不是一个真正的解决方案,尽管人们对新的内置 Rx 支持进行了大肆宣传。


我认为保留的片段不会达到您想要的效果。它可以帮助处理配置更改,但不能帮助处理活动之间的更改。

您可能应该将问题分成两个问题,一个是从哪里开始网络调用,另一个是接收响应。

对于第一个问题,在Activity/Fragment中可以正常启动网络调用。如果您要经常这样做,您可能需要管理服务中的调用并使用某种队列。

要接收响应,您应该确保您的侦听器(回调或订阅者)未绑定到您的 Activity/Fragment 实例(对嵌套类或顶级类使用静态)。然后,您可以使用广播或 EventBus/Otto 将结果转发到活动。

这可以在回调/订阅者中处理,也可以在服务上下文中处理。 (虽然如果你想在 Activity 中使用 Broadcast,你应该引用 Context.getApplicationContext() 而不是当前的 Activity 上下文,以防你的 Activity 被销毁)

执行此操作后,即使请求网络调用的活动已停止,您的网络调用也应该正常恢复而不会出现错误。

最后一步是缓存响应,因为如果活动停止,那么响应将无处可去。虽然网络调用完成了,但是却被浪费了。您应该以某种方式缓存这些响应,以便您的 Activity/Fragment 可以在重新创建时检索它们。

就我个人而言,我会选择 Service 与 EventBus 的组合。

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

将 REST 调用与“Activity”分离的最佳方法 的相关文章

  • RecyclerView每隔几个项目都是相同的 - 可扩展项目

    我的 recyclerView 有问题 我正在使用此布局来扩展 recyclerView 中的 cardView https github com AAkira ExpandableLayout https github com AAkir
  • 在解决依赖关系之前运行 gradle 任务

    我想运行一个 gradle 任务 在 gradle 尝试解决依赖关系之前获取其他源并设置它们 在 build gradle 中有一个任务 用于获取子项目的源代码 该任务需要在 Gradle 尝试解决依赖关系之前运行 因为子项目是依赖关系的一
  • 强制关闭导致HTTP实体可能不为空

    这里是发送数据 Http 的完整代码 asynctask private class MyAsyncTaskPupuk extends AsyncTask
  • Android 应用程序主活动出现 ClassNotFoundException

    大多数设备都可以运行我的应用程序 但我收到此错误报告 java lang RuntimeException Unable to instantiate activity ComponentInfo com company app com c
  • Android 和 iOS 中的应用程序文件大小差异

    通过使用两个应用程序分发服务 Android 市场和 Apple 应用程序商店 我发现了一个谜团 Apple 应用程序的文件大小通常大于 Android 应用程序 我似乎找不到任何对这些差异的解释 而且这似乎是一个未触及的主题 我尝试过分配
  • Android:让用户从图库中选择图像或视频

    是否可以以这样的方式启动图库 以便同时显示图片和视频 Thanks 从图库中选择音频文件 Use MediaStore Audio Media EXTERNAL CONTENT URI Intent intent new Intent In
  • Android 上 Java 库中的代码出现 NoClassDefFoundError

    我的用户经常遇到错误 应用程序在启动期间崩溃 当应该加载 MainActivity 时 VM 显然找不到该类 我不明白为什么 该应用程序的架构是 我的免费版和专业版都使用一个通用项目 不知道是否相关 请参阅下面的堆栈跟踪 有什么想法吗 ja
  • Android物理引擎[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在研究了 3D 游戏编程之后 很快就明白了为什么物理引擎非常有用 Android 支持哪些物理引擎并且可以在 Android 上使用 关于
  • 具有多个字符串的列表视图

    我正在尝试创建一个包含多个字符串的列表视图 现在我有一个可以实现的功能 while i lt 10 GETS DATA FROM WEBPAGE ETC a DATAFROMWEBPAGE1 b DATAFROMWEBPAGE2 c DAT
  • 在一个react-native项目中使用谷歌地图和FCM

    I want to use google map and FCM in one react native project first I added FCM in project everything was okay but when I
  • android device.getUuids 返回 null

    我正在尝试使用低功耗蓝牙 BLE 通过 Android 应用程序连接到 Arduino Uno 我正在 Android Studio 上进行开发 使用 Samsung Galaxy S4 和 Android 版本 5 0 1 进行测试我点击
  • 为什么 Android 上的免安装应用有两种设置?

    我使用的是运行 Android 11 的 Pixel 3 我发现有 2 种不同的设置可以控制免安装应用的某些方面 设置 应用程序和通知 默认应用程序 打开链接 即时应用程序 即使未安装 也打开应用程序中的链接 切换默认为开 Google P
  • 如何从Android webview下载文件?

    我下面的代码可以很好地加载 url 页面 并且在搜索歌曲后 当我单击下载链接时 它崩溃了 关于如何让下载管理器与网络视图一起工作的教程并不多 我究竟做错了什么 import java io File import android app A
  • 可下载字体例外

    我决定使用可下载字体 https developer android com guide topics ui look and feel downloadable fonts html在我的项目中 IS 按照指南中的建议实施了所有内容 当我
  • Android RxJava 2 JUnit 测试 - android.os.Looper 中的 getMainLooper 未模拟 RuntimeException

    我在尝试为正在使用的演示者运行 JUnit 测试时遇到 RuntimeExceptionobserveOn AndroidSchedulers mainThread 由于它们是纯 JUnit 测试而不是 Android 仪器测试 因此它们无
  • 尝试重新打开已关闭的对象:sqlitequery

    所以本质上我查询数据库两次 我不明白这个错误真正来自哪里 因为我没有在任何地方关闭数据库 返回错误的代码是这样运行的 我查了一下 刚刚看到一个像我这样的案例 BeaconHandler pullAllDB new BeaconHandler
  • 如何在 Android 中不使用 Intent 裁剪图像

    我正在尝试裁剪图像我使用了下面的代码 意图 i new Intent Intent ACTION PICK android provider MediaStore Images Media EXTERNAL CONTENT URI i pu
  • 使用Android Camera API,拍摄照片的方向始终未定义

    我使用相机API 拍摄的照片总是旋转90度 我想旋转它 所以首先我想知道图片的方向 这一点我被卡住了 我总是以两种方式得到未定义的方向 这是代码 Override public void onPictureTaken byte data C
  • 如何在 Android 应用程序退出之前进行一些清理?

    当我的 Android 应用程序终止时 是否有某种 onTerminate 方法可以进行一些清理 我想清除一些 SharedPreferences 我有一个活动 它保持几个数字的运行平均值 并将其存储在 SharedPreference 中
  • 如何在 Android 的应用程序中使用 LDAP 身份验证?

    我想在我们的应用程序中添加 LDAP 身份验证 我在 Github 上搜索并找到了两个应用程序 但它们无法连接到服务器 通过ldap连接服务器的必要条件是什么 查看 UnboundID SDK 他们有一个适用于 Android 的套件 该应

随机推荐

  • 仅当使用 Web 邮件客户端时,Mailto 链接才会在新选项卡中打开

    我有一个网页 可创建联系人及其电子邮件地址列表 对于 mailto 链接 您有两个选项 1 在当前窗口中打开它或 2 在新选项卡 窗口中打开它 我看到双方都存在潜在的缺点 对于网络邮件客户端 例如 gmail 选项 1 并不理想 因为它会劫
  • 您可以在其中放置图表的 Microsoft Office 剪贴板格式有哪些?

    我正在尝试在内存中创建一个可以提供拖放操作的 DOCX 我首先尝试了 嵌入源 然而 虽然它看起来很完美 OLE 包装器中的 DOCX 但 Word 并不使用它进行拖放 尽管它 确实使用它进行剪切和粘贴 有没有办法强制Word Excel P
  • 使用 Iperf 进行 haproxy 的 udp 流量

    我正在使用 Docker 容器开展我的个人项目 关于 Haproxy 的 性能评估 我正在使用 Python 进行编程 并使用 iperf 来生成流量 我创建了几个 Docker 容器作为客户端和服务器 客户端应该通过充当负载均衡器的 Ha
  • QML 将纹理应用于网格

    我正在尝试将图像纹理应用到 QML Qt 5 6 2 中的网格 我从示例 Shadow Map QML 开始 我想对 GroundPlane 进行纹理处理 材质和效果 qml 类应用于该 GroundPlane 网格 但我看不到如何应用图像
  • 在 LINQ to SQL 中查找或创建对象的通用方法?

    很多时候在我的LINQ 到 SQL http en wikipedia org wiki Language Integrated Query LINQ to SQL 28formerly called DLINQ 29代码中 我需要 查找或
  • 获取类实例变量并使用反射打印它们的值

    我有 2 个带有 getter 和 setter 的 POJO 类 现在我试图获取该类的所有类实例变量 我知道我们可以使用反射怎么办呢 这是我的 POJO 类 它将扩展我的反射类 class Details private int age
  • 使用公司范围的超级/父 POM 覆盖超级 POM

    我们希望有一个全公司超级POM它将继承自通常的超级 POM 我们公司的所有项目都会从中继承隐式继承 这可能吗 截至目前我们必须显式继承来自我们公司范围内的超级 POM 这不是很方便 而且容易出错 有人可以建议吗 据我所知 这方面没有最佳实践
  • 使用 AJAX 时检查会话超时

    我有一个 ColdFusion 页面 用户可以打开模式并查看有关一行数据的更多信息 但是 如果用户在页面上停留的时间超过默认的 20 分钟会话超时 则会抛出错误 因为它正在查找会话变量但找不到它们 我了解如何使用服务器端代码来捕获此问题 但
  • 如何获得具有交替距离的xticks?

    我有一个条形图 其中 x 轴有国家 地区的 2 个字母标签 我必须选择一个非常小的字体 这样 x 刻度就不会相互重叠 有什么方法可以指定 x 刻度和 x 轴之间的距离 以便我可以选择更大的字体而不会重叠标签 现在 所需的示例 axis ti
  • 使用 geopandas 缓冲错误点

    晚上好 我正在开发一种产品来检测订阅区域内的本地事件 罢工 黄色多边形应该是围绕中心红点 40KM 左 和 50KM 右 的圆圈 绿点是我的罢工 应该在我的过程中检测到 看来我当前使用的 buffer 没有产生预期的 40 50 Km 缓冲
  • 为什么我的保证金不能与位置一起使用:固定?

    JSFiddle 演示 https jsfiddle net 0cmvg92m 我有一个用于标题的 div 和一个用于内容换行的 div 由于某种原因 我无法在标题底部留出边距来强制内容换行向下推 它只是完全忽略它 我不知道为什么 有谁知道
  • PHP IIS7 MSSQL 调用未定义的函数 sqlsrv_connect

    我有 MSSQL Server 2008 MS WINDOWS SERVER 2008 RC2 和 PHP 5 4 php info 有行 PHP PDO SQLSRV 54 NTS extension php pdo sqlsrv 54
  • 来自 gitlab-ci docker 的 SSH 在“SSH2_MSG_KEX_ECDH_REPLY”上失败

    我正在尝试从 GitLab CI 中运行的 Docker 部署容器通过 SSH 连接到远程网络服务器 我第一次尝试时确实成功连接了一次 现在它不断失败 调试输出的最后两行 完整输出如下 是 debug1 expecting SSH2 MSG
  • 如何关闭yarn@2 PnP?

    我正在使用纱线2 0 0 rc 27 工作区 TypeScript 我想关闭 PnP 并使用node modules再次 我尝试了以下设置package json installConfig pnp false 然而 Yarn 每次都使用
  • 主干视图扩展被污染

    我有一个代表模式的视图 该视图有一些属性 例如页脚额外类 我遇到一个问题 当某些模式改变它的值时 所有模式都会收到相同的属性 这是例子 var ModalView AlertingView extend className modal pa
  • iPhone 和 Core Data:如何在更新之间保留用户输入的数据?

    考虑一个包含动物目录的 iPhone 应用程序 该应用程序应允许用户为每只动物添加自定义信息 比如说评级 范围为 1 到 5 以及他们可以输入的有关该动物的一些注释 但是 用户将无法修改动物数据本身 假设当应用程序更新时 静态 目录部分应该
  • 如何使用 JScript 获取进程的主窗口句柄?

    JScript 中是否有任何方法可以通过提供进程名称来获取进程主窗口的句柄 这Process MainWindowHandle http msdn microsoft com en us library system diagnostics
  • 从开发迁移到云时从一个连接字符串切换到另一个连接字符串

    我正在开发一个云应用程序 当我在计算机上测试应用程序时 我希望在 Service Configuration cscfg 中按如下方式设置连接字符串
  • Jquery 窗口最小化切换

    我有一个 div 当您单击另一个 div 时 它会切换显示和不显示 我如何修改我的代码 以便当用户最小化整个浏览器窗口时它会自动切换 从视图中隐藏 div 以便当用户取消最小化窗口时 div 不再可见 最小化窗口 或切换到另一个应用程序 应
  • 将 REST 调用与“Activity”分离的最佳方法

    我正在使用 Retrofit 并希望当用户在我的活动之间导航时 REST 调用能够继续存在 而不是仅在配置更改时保留它们 几个选项 改进同步调用AsyncTask并将其放入保留的 任务片段 http www androiddesignpat