如何在后台任务中正确使用 Android Room(与 UI 无关)
How to properly use Android Room in background tasks (unrelated to UI)
目前 Room 与 DB 的 UI 集成工作良好:
用于数据库操作的 Dao
用于与 Daos 交互并将数据缓存到内存中的存储库
ViewModel 抽象存储库和 link 到 UI 生命周期
但是,出现了另一种情况,我很难理解如何正确实施房间使用。
我有一个网络 API,它是纯静态的,构建为反映服务器的 REST 架构。
有一个解析器方法遍历 URL 结构并通过反射将其转换为现有的 API 并调用他找到的任何最终方法。
在此 API 中,每个 REST 操作都由等效 REST 命名结构下的方法表示 class,即:
/REST 中的联系人等同于 API
中的 Class Contacts.java
POST, GET, DELETE in rest等同于各自class
中的方法
示例:
public class Contacts {
public static void POST() {
// operations are conducted here
}
}
这是我的难处;我应该如何将 ROOM 集成到 POST 方法中 correctly/properly?
目前我有一个临时解决方案,它是实例化我需要插入数据并使用它的存储库,但这是每次调用该方法时的一次性情况,因为这里绝对没有生命周期,也没有有没有一种方法可以让一个足够细化的东西值得拥有(我不知道 API 中需要多长时间的存储库才能证明将其缓存 X 时间)。
我目前工作的例子:
public class Contacts {
public static void POST(Context context, List<Object> list) {
new ContactRepository(context).addContacts(list);
}
}
或者将其用作单例:
public class Contacts {
public static void POST(Context context, List<Object> list) {
ContactRepository.getInstance(context).addContacts(list);
}
}
鉴于存在生命周期,与 View 相关的 Room 交互一切正常,但在这种情况下,我不知道如何正确地做到这一点;这些不仅仅是视图可能调用网络请求的情况 - 然后我只使用 networkboundrequest 或类似的 - 这也可以是服务器发送的数据而应用程序从未请求它,例如应用程序相关数据的更新,如用户开始与您的对话 - 该应用程序无法知道,因此它首先来自服务器。
如何正确实施?我还没有找到针对这种情况的任何指南,恐怕我可能做错了。
编辑:根据使用的标签和提供的示例,该项目不是 Kotlin,因此请提供任何不依赖于迁移到 Kotlin 以使用其协程或类似 Kotlin 功能的解决方案。
似乎使用单例模式,就像我已经在使用的那样,是可行的方法。对于像这样的简单场景,似乎没有可用的文档。所以这基本上是一个猜谜游戏。我不知道这是一种不好的做法还是有任何内存泄漏风险,因为同样,也没有这方面的文档。
目前 Room 与 DB 的 UI 集成工作良好:
用于数据库操作的 Dao
用于与 Daos 交互并将数据缓存到内存中的存储库
ViewModel 抽象存储库和 link 到 UI 生命周期
但是,出现了另一种情况,我很难理解如何正确实施房间使用。
我有一个网络 API,它是纯静态的,构建为反映服务器的 REST 架构。
有一个解析器方法遍历 URL 结构并通过反射将其转换为现有的 API 并调用他找到的任何最终方法。
在此 API 中,每个 REST 操作都由等效 REST 命名结构下的方法表示 class,即:
/REST 中的联系人等同于 API
中的 Class Contacts.javaPOST, GET, DELETE in rest等同于各自class
中的方法示例:
public class Contacts {
public static void POST() {
// operations are conducted here
}
}
这是我的难处;我应该如何将 ROOM 集成到 POST 方法中 correctly/properly?
目前我有一个临时解决方案,它是实例化我需要插入数据并使用它的存储库,但这是每次调用该方法时的一次性情况,因为这里绝对没有生命周期,也没有有没有一种方法可以让一个足够细化的东西值得拥有(我不知道 API 中需要多长时间的存储库才能证明将其缓存 X 时间)。
我目前工作的例子:
public class Contacts {
public static void POST(Context context, List<Object> list) {
new ContactRepository(context).addContacts(list);
}
}
或者将其用作单例:
public class Contacts {
public static void POST(Context context, List<Object> list) {
ContactRepository.getInstance(context).addContacts(list);
}
}
鉴于存在生命周期,与 View 相关的 Room 交互一切正常,但在这种情况下,我不知道如何正确地做到这一点;这些不仅仅是视图可能调用网络请求的情况 - 然后我只使用 networkboundrequest 或类似的 - 这也可以是服务器发送的数据而应用程序从未请求它,例如应用程序相关数据的更新,如用户开始与您的对话 - 该应用程序无法知道,因此它首先来自服务器。
如何正确实施?我还没有找到针对这种情况的任何指南,恐怕我可能做错了。
编辑:根据使用的标签和提供的示例,该项目不是 Kotlin,因此请提供任何不依赖于迁移到 Kotlin 以使用其协程或类似 Kotlin 功能的解决方案。
似乎使用单例模式,就像我已经在使用的那样,是可行的方法。对于像这样的简单场景,似乎没有可用的文档。所以这基本上是一个猜谜游戏。我不知道这是一种不好的做法还是有任何内存泄漏风险,因为同样,也没有这方面的文档。