Robospice - 在更改活动时保持spice服务继续运行

R4j*_*R4j 8 android android-service robospice

我使用RoboSpice库来执行异步任务.从他们的例子中,spice服务在BaseActivity中声明,它从activity的onStart方法开始,并在activity的onStop中停止.一切都很好,但是当我想从互联网下载文件,然后我改为另一个活动时,这个下载任务被取消,因为spice服务已停止.看起来像:

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();
  }
} 
Run Code Online (Sandbox Code Playgroud)

所以我想知道是否有任何安全的方法来保持下载任务继续从Spice服务运行(此任务不触摸UI),另一个任务正常工作(意味着它们可以在停止活动时取消)但它仍然可以尊重活动生活圈.

Sni*_*las 11

@ R4j,你错过了这一点.当持有spicemanager的活动停止时,请求不会停止.在RS中,请求将具有自己的生命周期,并且将在不同的上下文(作为Android服务的spice服务)中被执行.

因此,如果你发起一个请求,那么你的活动就会死亡或者被杀死,那么spice请求将以自己的方式继续下去并继续下载.解析也会发生,最后您的结果将被放置在缓存中.如果有的话.

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

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

    • 使用spiceManager.addListenerIfPending在任何挂起的请求上重新插入新活动
    • 使用spiceManager.getDataFromCache获取任何可能已被先前请求放入缓存的结果
  • 或者,如果您想在B本身中重新执行请求,您可以,并且您将很高兴得知如果您使用具有相同缓存密钥的相同请求类,RS会将您的新请求聚合到任何待处理的请求中您.

在RS中,请求由复合密钥标识,该复合密钥由"请求结果类别"+"请求缓存"构成.此复合键可用于检索挂起的请求以及此请求在缓存中放置的任何结果.