事件总线和android ui组件的生命周期

时间:2014-12-19 10:54:48

标签: android greenrobot-eventbus

我一直在寻找完美的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提供了stickyevents。但如果不删除,它们可能会导致内存泄漏。

来自square的Otto介绍了“Producer”模式,可用于代替粘性事件。

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

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

有谁能请分享如何处理这个边缘案例的想法?任何干净的解决方案?

1 个答案:

答案 0 :(得分:1)

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

在大多数情况下,使用粘性事件和恕我直言,完全没问题。是的,从技术上讲,这是一个内存泄漏,因为事件存储在内存中,除了eventbus之外什么也没有引用它。但是根据定义,粘性事件在技术上都是内存泄漏,直到你真正使用它们为止?因此,如果你启动你的片段然后突然使用粘性事件,它就不再是内存泄漏了。

无论如何,只要事件不包含一百万条记录或像图像这样的大型数据结构,粘性事件就不会过于虔诚。然后你的记忆泄漏理论开始变得更有意义。

但是,您真正想要做的是缓存网络呼叫的结果吗?所以......

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