我已经成功创建了一个 Retrofit API Rest客户端,同时生成了 GET & POST 调用并将其纳入 Robospice 作为后台服务。
但是,我希望 Robospice 服务连接到数据库,并从 GET 调用中异步保留检索到的对象。使用 Retrofit Callback
类似乎是显而易见的方法,但连接到数据库需要Context
,我担心泄漏Context
。
那么,在处理请求之前和之后,将 Robospice SpiceService
保存到数据库的最佳方法是什么?
答案 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);
}