Robospice / Retrofit后台服务访问数据库

时间:2013-09-25 22:25:29

标签: android robospice retrofit

我已经成功创建了一个 Retrofit API Rest客户端,同时生成了 GET & POST 调用并将其纳入 Robospice 作为后台服务。

但是,我希望 Robospice 服务连接到数据库,并从 GET 调用中异步保留检索到的对象。使用 Retrofit Callback类似乎是显而易见的方法,但连接到数据库需要Context,我担心泄漏Context

那么,在处理请求之前和之后,将 Robospice SpiceService保存到数据库的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

最后,当我正在批量处理各种 Rest API服务调用以保存广播(Reto Meier Dev Bytes: Efficient Data Transfers)时,我调用了Rest API服务(RetrofitSpiceService s)来自控制器Robospice SpiceService,其中包含DatabaseHelper(需要Context)的引用和 Rest 服务的相应Retrofit回调。

这样,控制器服务处理所有触发(AlarmManager触发控制器服务)并持久保存到DB,Rest服务可以正常关闭自己,而不知道context,{{1等等。

对于@ lion789:
我有4个模型,每个模型都有相应的API调用与服务器同步(1 POST ,3 GET )。
要处理这些同步调用,我的database包含4个IntentService属性和4个 Retrofit SpiceManager类 - 每个模型/ API调用一个。
Callback传递IntentService,表示应该调用的API序列。
Enum调用运行的相应IntentService,然后SpiceManager触发持久性并调用Callback方法触发序列中的下一个API调用。

很多这是抽象和接口的,因为我将它用于我的Auth和Push注册代码,所以这是一个噩梦描述,但它到目前为止一直运作良好。

答案 1 :(得分:2)

你的问题对我来说真的很模糊。我不明白为什么你不能使用RS的正常持久性机制。如果这样做,在执行请求时很容易保留数据。

也许我错过了什么。因此,如果您的要求是真的要自己保留数据,那么您提出的方法看起来是正确的。您可以在请求中注入spice服务本身(例如,请参阅RetrofitSpiceService中的addRequest覆盖方式)。然后,该请求将保存一个上下文,该上下文可用于回调内或请求本身内的持久性。

最近我使用改造和RS编写了一个POST请求。我更改了POST请求的签名以返回Void。然后稍微修改了改装转换器以处理该情况并返回null。如前所述,请求通过注入接收了spice服务,并且可以对数据库执行某些操作。

以下是一些代码,用于将应用程序注入spice服务中的请求中。

    @Override
    public void addRequest(CachedSpiceRequest<?> request,
                    Set<RequestListener<?>> listRequestListener) {
            if (request.getSpiceRequest() instanceof MySpiceRequest) {
                    MySpiceRequest<?> mySpiceRequest = (MySpiceRequest<?>) request
                                    .getSpiceRequest();
                    mySpiceRequest.setApplication(this.getApplication());
            }
            super.addRequest(request, listRequestListener);
    }