在 Android 中下载数据和通知 UI 的过程中,有几件事困扰着我。我正在使用 (Intent
)Service
下载数据,效果很好。
不过,我不确定如何通知 UI 数据已检索。经过一些研究和讨论 Downloading data using IntentService - Lifecycle Changes , 和 Which is the best way to communicate between service and activity? ,我到了一个我不确定该再使用哪种方法的地步。
我正在寻找的替代方案是:
- 服务 + 本地广播 + 数据库
Activity
将启动Service
服务
会将数据下载到数据库中Service
将发送带有“完成”通知的Broadcast
Activity
将获取此Broadcast
并使用AsyncTask
从数据库中检索数据
- 每次向用户显示时,
Activity
都会使用AsyncTask
从数据库中检索数据(onResume
,对于这种情况由于用户离开而错过了广播)。
- 服务 + ResultReceivers + 数据库
Activity
将启动Service
服务
会将数据下载到数据库中Service
会通知ResultReceiver
它已完成Activity
将使用AsyncTask
从数据库中检索数据ResultReceiver
不是每次都检索数据,而是在整个生命周期更改中重用,通知不会丢失。
- 服务 + ResultReceivers + bundle
Activity
将启动Service
Service
将下载数据(可选地下载到数据库中)Service
会通知ResultReceiver
它已完成,并在Bundle
中提供数据。Activity
将从Bundle
中检索数据(不需要AsyncTask
)。ResultReceiver
不是每次都检索数据,而是在整个生命周期更改中重用,通知不会丢失。
选项1 和2 要求用户等待数据库读/写操作。因此,选项 3 更快,但我看到许多消息来源建议不使用Broadcast
或 ResultReceiver
来传输数据(虽然我不确定具体原因)。
目前,我坚持使用选项 3,但我不确定这是否真的是一种正确的方法,以及我是否遗漏了什么。
有人可以阐明这一点吗?
虽然有些人(可能是正义的)认为这个问题是基于意见的,但我正在寻找我可能忽略的陷阱。此外,我正在寻找有关为什么不建议使用ResultReceiver
或Broadcast
发送结果数据的答案。
最佳答案
谨慎使用某种 DataManager
单例实例,由数据库备份似乎是一个可靠的解决方案。使用 ResultReceiver
,UI 会收到通知并从 DataManager
中提取数据。
我还发现使用 ResultReceiver
和 Broadcast
发送数据对性能有负面影响,因为对象需要序列化。这是一项代价高昂的操作,GC 可能会因此启动。
关于android - 下载数据和更新 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23636893/