Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 当用户点击主页按钮时,RoboSpice请求结果_Android_Activity Lifecycle_Robospice - Fatal编程技术网

Android 当用户点击主页按钮时,RoboSpice请求结果

Android 当用户点击主页按钮时,RoboSpice请求结果,android,activity-lifecycle,robospice,Android,Activity Lifecycle,Robospice,我们将Robospice 1.4.12与okhttp一起使用。除了当用户点击home(主页)按钮然后返回活动时从请求中获得结果外,一切都正常 示例:我们发出一个请求,然后按home按钮,等待请求完成,当我们返回到活动时,侦听器从未收到通知。如果我们在请求完成之前回来,一切正常 方向改变很好。我们正在使用LruCacheObjectPersister进行内存缓存 现在一些代码: 我们的服务: public class MyService extends OkHttpSpiceService {

我们将Robospice 1.4.12与okhttp一起使用。除了当用户点击home(主页)按钮然后返回活动时从请求中获得结果外,一切都正常

示例:我们发出一个请求,然后按home按钮,等待请求完成,当我们返回到活动时,侦听器从未收到通知。如果我们在请求完成之前回来,一切正常

方向改变很好。我们正在使用LruCacheObjectPersister进行内存缓存

现在一些代码:

我们的服务:

public class MyService extends OkHttpSpiceService {

    @Override
    public CacheManager createCacheManager(Application application) throws CacheCreationException {
        CacheManager cacheManager = new CacheManager();
        int cacheSize = 1 * 1024 * 1024; // 1MiB
        cacheManager.addPersister(new LruCacheObjectPersister<LoginModel>(LoginModel.class,
                new LruCache<Object, CacheItem<LoginModel>>(cacheSize)));
        return cacheManager;
    }

}
请求执行:

spiceManager.execute(new LoginRequest(), REQUEST_KEY, DurationInMillis.ONE_DAY,
                        new LoginRequestListener());

我们遗漏了什么吗?

我认为Robospice将CacheManager存储在服务中。但服务使用绑定与ServiceManager进行通信,当您调用ServiceManager.shouldStop时,服务将停止并与他进行缓存管理


解决方案:将CacheManager作为静态字段存储在SpiceService中。对于第一个调用,您创建CacheManager,对于下一个调用,只需返回静态CacheManager,这就是RS的工作方式。你必须明白,在Android上,你永远无法确定在按下home键之前和返回后的活动是同一个实例。同时,android可以垃圾收集你的活动。是的,这种情况会发生

因此,RS所做的是,它在不同的上下文中执行查询,以确保启动请求上下文的生存时间足以执行请求。活动的情况并非如此

也就是说,如果您想重新连接到挂起的请求,请查看spice管理器方法。您将看到一个
addListenerIfPending
something方法。这就是方法。RS还让您检查是否存在这样一个挂起的请求。您还可以检查缓存是否已经包含您的数据,等等

spiceManager.execute(new LoginRequest(), REQUEST_KEY, DurationInMillis.ONE_DAY,
                        new LoginRequestListener());