我使用RoboSpice库来执行异步任务。从他们的示例中,spice 服务在 BaseActivity 中声明,它在活动的 onStart 方法中启动,并在活动的 onStop 中停止。一切都很好,但是当我想从互联网下载文件,然后我更改为另一个活动时,此下载任务被取消,因为香料服务已停止。它看起来像:
public abstract class BaseActivity{
/** The request manager. */
private SpiceManager requestManager = new SpiceManager(RequestService.class);
@Override
protected void onStart() {
requestManager.start(this);
super.onStart();
}
@Override
protected void onStop() {
requestManager.shouldStop();
super.onStop();
}
}
所以我想知道是否有任何安全的方法可以让下载任务继续从 Spice 服务运行(此任务不接触 UI),并且另一个任务正常工作(意味着它们可以在停止活动时被取消),但它仍然可以尊重活动生命周期。
@R4j,你错过了重点。当持有香料管理器的活动停止时,请求不会停止。在 RS 中,请求将具有自己的生命周期,并将在不同的上下文(作为 Android 服务的 spice 服务)中执行。
因此,如果您发出请求,那么您的活动就会死亡或被杀死,香料请求将自行进行,下载将继续。解析也会发生,最后你的结果将被放在缓存中。如果有的话。
因此,如果要在活动 A 中触发请求并在活动 B 中获取结果,则应:
- 只需像往常一样在活动 A 中执行请求,遵循 RS 示例
-
在 B 中,启动 spiceManager 后(即在 super.onStart() 之后),做 2 件事:
- 使用 spiceManager.addListenerIfPending 在任何挂起的请求上重新插入新活动
- 使用 spiceManager.getDataFromCache 获取先前请求可能已经放入缓存中的任何结果
-
或者,如果你想在 B 本身中重新执行请求,你可以,并且你会很高兴地了解到,如果你使用相同的请求类和相同的缓存键,RS 会为你聚合你的新请求到任何挂起的请求。
在 RS 中,请求由"请求结果类"+"请求缓存"组成的复合键标识。此复合键可用于检索挂起的请求以及此请求在缓存中放置的任何结果。
在应用程序类中减少一个 spicemanager 实例,并在活动中访问它以启动后台服务。
public class MyApplication extends Application {
private static MyApplication instance;
private SpiceManager spiceManager = new SpiceManager(RequestService.class);
@Override
public void onCreate() {
super.onCreate();
}
public SpiceManager getManager()
{
return spiceManager;
}
}
在"活动"中,可以调用它。请参阅下面的代码。
((MyApplication) getApplicationContext()).getSpiceManager().startService(........);