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

8

我使用了RoboSpice库来执行异步任务。从他们的示例中可以看到,spice服务在BaseActivity中声明,在活动的onStart方法中启动,在活动的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();
  }
} 

我想知道是否有安全的方法可以让Spice服务继续运行下载任务(此任务不涉及UI),而其他任务正常工作(也就是说,当停止活动时可以取消它们),但它仍然可以尊重活动生命周期。

2个回答

11
@R4j,你没有理解重点。当持有spicemanager的活动停止时,并不会停止请求。在RS中,请求将具有自己的生命周期,并在不同的上下文(一个作为Android服务的香料服务)中执行。
因此,如果您发出请求,然后您的活动死亡或被杀死,香料请求将按照自己的方式继续进行下载。解析也将发生,最后将在缓存中放置结果。如果有的话。
因此,如果您想在活动A中触发请求并在活动B中获得结果,则应:
  • 如往常一样在A中执行请求,遵循RS示例
  • 在B中,在启动spiceManager之后(即在super.onStart()之后),做两件事:
    • 使用spiceManager.addListenerIfPending将新的活动重新连接到任何挂起的请求上
    • 使用spiceManager.getDataFromCache获取可能已由以前的请求放入缓存中的任何结果
  • 可选,如果希望在B本身中重新执行请求,则可以这样做,如果使用相同的请求类和相同的缓存密钥,则RS将为您聚合新请求和任何挂起的请求。
在RS中,请求由“请求结果类”+“请求缓存”组成的复合键标识。该复合键可用于检索挂起的请求以及由此请求放入缓存中的任何结果。

那么我必须使用缓存来保持请求在活动之间保持活跃?没有缓存的请求怎么样? - ductran
如果没有缓存,您仍然可以使用addListenerIfPending或execute重新插入到挂起的请求中。前者只在请求挂起时插入侦听器,后者则同时触发一个请求(如果没有挂起)。 - Snicolas
不好意思,请问你能否举个例子,如何进行无缓存的重新插入?我尝试使用缓存请求成功了,但是对于非缓存请求,addListenerIfPending现在对我来说似乎不起作用。 - ductran
在这种情况下,更简单的方法是在execute中同时使用缓存键和缓存过期时间,你说得对,我根本没有表达清楚。但是可以使用一个不带缓存的SpiceService,比如UncachedSpiceService。 - Snicolas

2
在您的应用程序类中声明一个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(........);

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