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),并且另一个任务正常工作(意味着它们可以在停止活动时被取消)但它仍然可以尊重活动生活圈。

4

2 回答 2

11

@R4j,您错过了重点。当持有 spicemanager 的活动停止时,请求不会停止。在 RS 中,请求将有自己的生命周期,并将在不同的上下文中执行(作为 Android 服务的香料服务)。

因此,如果您发出请求,那么您的活动就会终止或被杀死,香料请求将继续进行并且下载将继续。解析也会发生,最后你的结果将被放入缓存中。如果有的话。

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

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

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

在 RS 中,请求由“请求的结果类别”+“请求缓存”组成的复合键标识。此复合键可用于检索挂起的请求以及此请求在缓存中放置的任何结果。

于 2013-11-12T06:08:26.143 回答
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(........);
于 2013-11-08T15:47:19.133 回答