android - 下载数据和更新 UI

标签 android android-service

在 Android 中下载数据和通知 UI 的过程中,有几件事困扰着我。我正在使用 (Intent)Service 下载数据,效果很好。

不过,我不确定如何通知 UI 数据已检索。经过一些研究和讨论 Downloading data using IntentService - Lifecycle Changes , 和 Which is the best way to communicate between service and activity? ,我到了一个我不确定该再使用哪种方法的地步。

我正在寻找的替代方案是:

  1. 服务 + 本地广播 + 数据库
    • Activity 将启动 Service
    • 服务会将数据下载到数据库中
    • Service 将发送带有“完成”通知的Broadcast
    • Activity 将获取此 Broadcast 并使用 AsyncTask
    • 从数据库中检索数据
    • 每次向用户显示时,Activity 都会使用 AsyncTask 从数据库中检索数据(onResume,对于这种情况由于用户离开而错过了广播)。
  2. 服务 + ResultReceivers + 数据库
    • Activity 将启动 Service
    • 服务会将数据下载到数据库中
    • Service 会通知 ResultReceiver 它已完成
    • Activity 将使用 AsyncTask 从数据库中检索数据
    • ResultReceiver 不是每次都检索数据,而是在整个生命周期更改中重用,通知不会丢失。
  3. 服务 + ResultReceivers + bundle
    • Activity 将启动 Service
    • Service 将下载数据(可选地下载到数据库中)
    • Service 会通知 ResultReceiver 它已完成,并在 Bundle 中提供数据。
    • Activity 将从Bundle 中检索数据(不需要AsyncTask)。
    • ResultReceiver 不是每次都检索数据,而是在整个生命周期更改中重用,通知不会丢失。

选项12 要求用户等待数据库读/写操作。因此,选项 3 更快,但我看到许多消息来源建议使用BroadcastResultReceiver 来传输数据(虽然我不确定具体原因)。

目前,我坚持使用选项 3,但我不确定这是否真的是一种正确的方法,以及我是否遗漏了什么。

有人可以阐明这一点吗?


虽然有些人(可能是正义的)认为这个问题是基于意见的,但我正在寻找我可能忽略的陷阱。此外,我正在寻找有关为什么不建议使用ResultReceiverBroadcast 发送结果数据的答案。

最佳答案

谨慎使用某种 DataManager 单例实例,由数据库备份似乎是一个可靠的解决方案。使用 ResultReceiver,UI 会收到通知并从 DataManager 中提取数据。

我还发现使用 ResultReceiverBroadcast 发送数据对性能有负面影响,因为对象需要序列化。这是一项代价高昂的操作,GC 可能会因此启动。

关于android - 下载数据和更新 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23636893/

相关文章:

android - 在服务中安排重复任务

android - 当 IntentService 启动时,Application 对象会启动吗?

android - 可访问性服务可以停止或终止吗?

Android在Andengine中为不同类型的实体实现对象池

java - 使用 ant 引用 jar(不是/libs)的外部文件夹

Android 应用突然与设备不兼容

Android 自动与自定义数据同步

android - 如何在 Android 中根据区域设置和设备屏幕指定单个图像

android - Glide : onError Callback

android - 如何处理华为和小米的 "battery optimizations"