【问题标题】:Robospice - keep spice service continue running when changing activityRobospice - 在更改活动时保持香料服务继续运行
【发布时间】:2013-11-12 14:08:26
【问题描述】:

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

【问题讨论】:

    标签: android android-service robospice


    【解决方案1】:

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

    因此,如果您发出请求,然后您的活动终止或被终止,则 spice 请求将按自己的方式进行,下载将继续。解析也会发生,最后你的结果将被放入缓存中。如果有的话。

    所以如果你想在活动A中触发请求并在活动B中得到结果,你应该:

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

      • 使用 spiceManager.addListenerIfPending 重新插入任何待处理请求的新活动
      • 使用 spiceManager.getDataFromCache 获取任何可能已被先前请求放入缓存的结果
    • 1234563请求任何待处理的请求。

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

    【讨论】:

    • 所以我必须为我的请求使用缓存以使其在活动之间保持活动状态?没有缓存的请求怎么样?
    • 如果没有缓存,您仍然可以使用 addListenerIfPending 或执行重新插入挂起的请求。前者仅在请求待处理时插入侦听器,第二个这样做并在没有待处理请求时触发请求。
    • 对不起,你能给我一个不缓存的重新插入的例子吗?我尝试了一个缓存请求,它成功了,但是对于非缓存请求,addListenerIfPending 现在对我不起作用。
    • 在那种情况下,更简单的,你说得对,我根本不清楚,是在执行中同时使用缓存键和缓存到期。但是使用没有缓存的 SpiceService,比如 UncachedSpiceService
    【解决方案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(........);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-04
      • 1970-01-01
      • 2014-01-21
      • 2022-01-16
      相关资源
      最近更新 更多