Robospice – 在改变活动时保持spice服务继续运行

我使用RoboSpice库来执行asynchronous任务。 从他们的例子中,spice服务在BaseActivity中声明,它从activity的onStart方法开始,并停在activity的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服务继续运行(这项任务不触及用户界面),另一个任务正常工作(意味着他们可以取消时,停止活动),但它仍然可以尊重活动生活圈。

Solutions Collecting From Web of "Robospice – 在改变活动时保持spice服务继续运行"

@ R4j,你错过了这一点。 持有spicemanager的活动停止时,请求不会停止。 在RS中,请求将有自己的生命周期,并将在不同的上下文中执行(一种是Android服务的调料服务)。

因此,如果您发起请求,那么您的活动就会死亡或死亡,调料请求将自行停止,下载将继续。 parsing也将发生,最后你的结果将被放置在caching中。 如果有的话。

因此,如果您想要在活动A中触发请求并在活动B中获得结果,则应该:

  • 只需像往常一样在活动A中执行请求,按照RS样本
  • 在B中,启动你的spiceManager(即在super.onStart()之后),做两件事情:

    • 使用spiceManager.addListenerIfPending在任何未决的请求上重新插入新的活动
    • 使用spiceManager.getDataFromCache来获取任何先前请求可能已经放入caching的结果
  • optionnally,如果你想重新执行在B本身的请求,你可以,你会很高兴得知,如果你使用相同的caching键相同的请求类,RS会聚合您的新请求,以任何未决的请求您。

在RS中,通过由“请求结果类别”+“请求caching”组成的复合关键字来标识请求。 这个复合键可以用来检索挂起的请求以及这个请求在caching中的任何结果。

在您的应用程序类中解压缩一个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; } } 

在Activity中,你可以调用它。 看到我的代码如下。

 ((MyApplication) getApplicationContext()).getSpiceManager().startService(........);