10

我正在寻找关于 android robospice 库如何管理活动生命周期的技术答案。从入门页面:

https://github.com/octo-online/robospice/wiki/Starter-Guide

“作为 Activity(或其他上下文)的内部类,添加一个 RequestlListener 将更新您的 UI。不用担心内存泄漏,RoboSpice 管理您的 Activity 的生命周期。”

我的问题是 robospice 如何自动更新请求侦听器,以便在轮换之后以及在活动被销毁并重新创建为新实例之后,它仍然能够使用正确的上下文调用正确的侦听器?

我一直在尝试对源代码进行逆向工程,但还没有找到答案:

https://github.com/octo-online/robospice

4

2 回答 2

9

@Take Chance Make Cha。你说的完全正确。RS 的设计考虑到了这种明确的需求:管理网络请求和活动的生命周期。

@craigrs84。基本上,RS 发生的事情是,在处理请求时,只要关联的活动处于活动状态,它的侦听器就会被调用。如果活动不再活动,则其所有侦听器都将从 RS 中拔出,并且不会收到通知。

RS 的主要目的是确保没有内存泄漏:您的活动,如果它必须死,将死并被垃圾收集,RS 不持有任何会阻止垃圾收集的硬引用。这确实是 RoboSpice 背后的核心理念。

如果您希望将活动的新实例重新插入待处理的请求(例如,您执行请求,然后旋转设备,然后获取活动的新实例,并希望该新实例接收请求的结果由前一个实例执行),这对于 RS 是可能的。

在这种情况下,spiceManager.addListenerIfPending在调用 spiceManager.start(..) 之后使用 on start 中的方法。这不会执行新请求,而是将新侦听器重新插入待处理的请求。如果没有待处理的请求,那么它什么也不做。

于 2013-10-11T09:16:22.793 回答
2

根据我的经验,简短的回答是它没有。

例如,如果您不调用SpiceManager.shouldStop()并执行请求,则对 RequestListener 的引用仍会保留,并且您可能最终会出现内存泄漏,因为如果您的 Activity/Fragment/Service 不再存在,它会尝试更新其中引用的任何内容存在。

于 2013-10-01T19:38:10.957 回答