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

我一直在寻找完美的 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.这个解决方案似乎更正确,但需要编写更多代码.

任何人都可以分享如何解决这个边缘案例的想法?有清洁的解决方案

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

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

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

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

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

相关文章
相关标签/搜索