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

时间:2014-05-16 14:05:50

标签: android activity-lifecycle robospice

我们正在使用带有okhttp的Robospice 1.4.12。除了在用户点按主页按钮然后返回活动时从请求中获取结果时,一切正常。

示例:我们触发请求,然后按主页按钮,我们等待请求完成,当我们回到活动时,听众永远不会收到通知。如果我们在请求完成之前回来,一切正常。

方向更改工作正常。我们在内存缓存中使用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;
    }

}

片段中的onStart:

@Override
    public void onStart() {
        super.onStart();
            //spice manager gets started in base fragment
        spiceManager.addListenerIfPending(LoginModel.class, REQUEST_KEY, new LoginRequestListener());
    }

请求执行:

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

我们错过了什么吗?

2 个答案:

答案 0 :(得分:1)

RS如何工作。您必须明白,在Android上,您无法确保在按下主页之前和返回之后的活动是相同的实例。同时,android可以垃圾收集你的活动。是的,这发生了!!

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

话虽如此,如果您想重新连接到待处理的请求,请查看spice manager方法。您将看到addListenerIfPending某种方法。这是做到这一点的方法。 RS还允许您检查是否存在此类待处理请求。您还可以检查缓存是否已包含您的数据等等。

答案 1 :(得分:0)

我认为Robospice将CacheManager存储在服务中。但Service使用绑定​​与ServiceManager进行通信,当您调用ServiceManager.shouldStop时,Service就会死掉,而CacheManage也会随之而来。

解决方案:将SpifeService中的CacheManager存储为静态字段。对于第一次调用,您创建CacheManager,对于下一次调用,只返回静态CacheManager