8

我一直在寻找完美的 android 应用程序架构,并阅读了一些关于这个主题的精彩博文。

1) http://www.mdswanson.com/blog/2014/04/07/durable-android-rest-clients.html

2) http://birbit.com/a-recipe-for-writing-responsive-rest-clients-on-android/

两篇文章都描述了如何利用事件总线在 android 组件(活动、片段、服务)之间进行通信。

一个,但非常重要的话题没有涉及。如何处理暂停时发布到 UI 组件的事件。

例如:服务在完成将数据下载到活动时发布事件。此时活动已暂停。由于事件总线在 onPause() 中被注销,我们完全失去了这个事件。

greendao 的 EvenBus 提供粘性事件。但如果不删除它们可能会导致内存泄漏。

Square 的 Otto 引入了“Producer”模式,可以用来代替粘性事件。

如果不手动删除粘性事件,第一个解决方案可能会导致内存泄漏。

第二个要求将数据保存在某个地方,直到 Producer 方法将其返回给订阅者。这个解决方案似乎更正确,但需要编写更多代码。

任何人都可以分享如何解决这种极端情况的想法吗?任何干净的解决方案?

4

1 回答 1

1

我还使用 EventBus 使用了一个非常优雅的架构。它是一个很好的工具,可以将您的 UI 与业务和通信层分离,并防止长时间运行的网络或数据库作业尝试更新已被破坏的 UI。我可以整天谈论它,但我会专注于你的问题。

在大多数情况下,使用粘性事件是完全可以的,恕我直言。是的,从技术上讲,这是一个内存泄漏,因为事件存储在内存中,除了事件总线之外什么都没有引用它......但是。但是从定义上讲,粘性事件都是技术上的内存泄漏,直到你真正使用它们对吗?因此,如果您突然启动片段并使用粘性事件,则不再是内存泄漏。

无论如何,只要事件不包含一百万条记录或像图像这样的大型数据结构,粘性事件就完全没问题。然后你的内存泄漏理论开始变得更有意义。

但是,您真正想做的是缓存网络调用的结果,对吗?所以...

我建议实现一些智能和持久的 http 缓存。Robospice 为您提供了很多开箱即用的功能。您可以定义缓存键、缓存文件位置和缓存超时 - 非常酷的东西。这会将缓存从内存(即粘性事件)中删除并放入文件中,在通信层的更下方,这可能更干净。

于 2016-02-26T16:57:38.340 回答