如果应用程序进入后台,然后回到前台,Robospice请求永远不会结束?

5
我正在使用RoboSpice库来调用REST API开发应用程序。除了一个问题,该库的一切都很正常。我不使用RoboSpice中提供的缓存,因此所有请求都是无缓存的。现在,当任何请求正在进行,用户按下主页按钮时,将调用onStop()方法,并调用spice管理器的shouldStop()方法取消注册所有请求监听器以进行通知。然后,当应用再次返回前台时,UI更新不会发生,因为监听器没有被通知。
我不想使用Robospice提供的缓存。有没有其他方法可以在不使用缓存的情况下获得UI更新通知?
1个回答

4
显然,使用RoboSpice无法实现您想要的功能,这是有充分理由的:这将是一个非常糟糕的想法。
当您的活动终止时(onStop),Android希望垃圾回收其实例。为此,它不应被任何东西引用。这就是为什么RS强制要求删除所有侦听器。通常,侦听器保留对活动的引用(作为内部类),而RS的最大成就在于让活动适当地死亡并垃圾回收。
因此,做您想做的事情显然会导致内存泄漏,并且大多数情况下会导致崩溃:当活动不再显示时,您希望更新其UI?看起来有点奇怪,不是吗?
也许最简单的方法是使用非常有限的缓存,或者每次活动进入onStart时执行所有请求。

1
我确实同意RS这样做是有原因的。但是,想象一下,当一个请求被发出并且进度对话框显示时,用户按下了主页按钮。REST调用将正常进行,当用户重新启动应用程序时,进度对话框仍然存在,因为UI没有更新,监听器已被注销。无论如何,目前似乎使用缓存是与RS配合的唯一方法。 - thefrugaldev
另一种方法是在 onDestroy 中调用 spiceManager.shouldStop() 并在 onCreate() 中启动 spicemanager。由于 onDestroy() 是如果活动被销毁时最后一个调用,因此这是可行的做法。 - thefrugaldev
@mobiledev,我认为第二种解决方案并没有更好。服务绑定非常棘手,首选位置是使用onStart/onStop这对方法。您可能会有兴趣从服务而不是活动中发出请求。 - Snicolas
我认为RS已经使用服务发出了请求。无论如何,我会看看是否可以使用缓存。 - thefrugaldev
当然可以,但启动上下文也可以是服务,而不仅仅是活动或片段。因此,您将拥有一个更长寿的上下文来执行您的请求并获取活动侦听器。例如,服务可以更新通知,显示进度。 - Snicolas
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接