2014-12-19 99 views
8

我一直在寻找完美的Android应用程序架构,并阅读了有关此主题的一些很棒的博客帖子。Android UI组件的事件总线和生命周期

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。但是如果不删除它们可能会导致内存泄漏。

奥托从广场引入了“生产者”模式,它可以用来代替粘性事件。

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

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

任何人都可以请分享想法如何解决这个边缘情况?任何清洁解决方案

+0

这是我也想知道的东西。你有没有找到满意的答案呢? – stefs 2015-07-06 21:19:02

+0

我试图自己解决这个问题。我创建了一个应用程序调解器对象(对于较大的应用程序,这可以分解为多个调解器),调解器对象对可用的活动有一个弱引用,该活动在resume和pause中设置并取消设置。当调度事件时,调解器接收事件,将结果保存到会话数据缓存中,然后将响应事件的命令排队,该事件将立即执行或恢复有效活动。我很乐意听到任何人解决这个问题。 – serenskye 2015-09-03 16:09:43

回答

1

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

使用粘滞事件,在大多数情况下,恕我直言,完全没问题。从技术上讲,这是内存泄漏,因为事件存储在内存中,除了事件总线引用它之外没有其他内容。但是按照定义,粘性事件在技术上都是内存泄漏,直到你实际使用它们为止?所以,如果你启动你的片段,然后突然使用粘滞事件,它不再是内存泄漏。

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

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

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