2013-09-25 28 views
10

我正在寻找技术答案,以了解android robospice库如何管理活动生命周期。从入门页面:robospice如何管理活动生命周期?

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

“作为一个内部类的活动(或其他方面),加一个RequestlListener将更新你的UI不用担心内存泄漏,RoboSpice管理您的活动的生命周期。”

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

我一直在试图反向工程的源代码,但没有找到答案尚未:

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

回答

9

@Take Chances Make Cha。你所说的完全正确。 RS的设计需要考虑到这一点:管理网络请求和活动的生命周期。

@ craigrs84。基本上,RS会发生什么情况,当处理请求时,只要关联的活动处于活动状态,就会调用它的监听器。如果该活动不再活跃,则其所有听众都将从RS中拔出,并且不会通知他们。

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

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

在这种情况下,在调用spiceManager.start(..)后立即使用方法spiceManager.addListenerIfPending。这不会执行新的请求,而是将新侦听器重新插入到待处理的请求中。如果没有请求正在等待,那么它将不会执行任何操作。

+0

所以如果你没有提供requestCacheKey,并且同时有多个同一个Activity运行的实例,那么addListenerIfPending仍然能够正常工作吗?或者在这种情况下没有足够的信息?这可能不太可能,但我很好奇。 – craigrs84

+0

@snicolas,我很好奇,如果你没有调用shouldStop()(或非异步方法)库不会回调那些注册到Activities,Fragments,Services等的监听器?如果不通过源代码挖掘太多,并且基于我的早期使用和库的测试,我会收到一个异常,当我收到一个对象已经“死亡”的回调。此外,图书馆是伟大的,请保持良好的工作! – AllDayAmazing

+0

如果你不调用shouldStop,那么监听器将被触发。这可能会导致崩溃和内存泄漏,因为经常监听器是内部类,并且对活动实例持有引用,这些引用已被销毁,并且如果您在侦听器中执行findViewById等操作,它甚至会崩溃。我想你明白了,只是想澄清事情。 – Snicolas

2

简短的回答,从我的经验是,事实并非如此。

例如,如果您没有调用SpiceManager.shouldStop()并执行请求,则对RequestListener的引用仍然保留,并且如果您的Activity /片段/服务不再存在。

+0

对不起,但没有,在听众没有内存泄漏RS。他们被删除,垃圾收集在shouldStop。 – Snicolas