【问题标题】:Robospice/ Retrofit background service accessing databaseRobospice/ Retrofit 后台服务访问数据库
【发布时间】:2013-10-01 17:05:55
【问题描述】:

我已经成功创建了一个 Retrofit API Rest 客户端,同时进行 GETPOST 调用,并将其合并到 Robospice 作为后台服务。

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

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

【问题讨论】:

    标签: android robospice retrofit


    【解决方案1】:

    你的问题对我来说真的很模糊。我不明白为什么你不能使用 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);
        }
    

    【讨论】:

      【解决方案2】:

      最后,当我批量处理各种 Rest API 服务调用以保存无线电 (Reto Meier Dev Bytes: Efficient Data Transfers) 时,我从控制器内调用了 Rest API 服务 (RetrofitSpiceServices) Robospice SpiceService 包含对 DatabaseHelper 的引用(需要 Context)和 Rest 服务的相应 Retrofit 回调。

      这样,控制器服务处理所有触发(AlarmManager 触发控制器服务)并持久化到数据库,而 Rest 服务可以在不知道 contextdatabase 或类似信息的情况下正常关闭。

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

      当我将它用于我的身份验证和推送注册代码时,其中的一个 很多 被抽象和接口,所以描述起来有点像噩梦,但到目前为止它运行良好。

      【讨论】:

      • 嘿,你有这样的例子吗......我实际上也在尝试使用 Robospice 以及通过 Retrofit 缓存数据
      • 编辑了我的答案,为@Lion789 提供更多信息。如果您需要更多信息,请告诉我。
      • 谢谢,其实很好奇,如果我有 okHttpClient 和改造,缓存会自动发生意味着我不需要使用 Robospice 吗?
      • @lion789 不太清楚缓存是什么意思。如果您正在谈论在数据库中持久化同步数据,我正在滚动我自己的 DatabaseHelper 而不是 Robospice 之一。如果您打算这样做,请查看 OrmLite 继承自 Robospice 数据库帮助程序。如果您正在谈论响应缓存(在本地文件中),可以通过 Retrofit 完成(请参阅 Jesse Wilson 的要点 gist.github.com/swankjesse/5889518
      • 哦,好的,谢谢,是的,我的意思是响应缓存...我不得不玩弄 jesse 的响应,因为它不起作用...但是有人告诉我,如果您只有两个库并在改造中的请求调用的标头中指定它......这就是我不确定的原因
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多