在Android开发中,使用NetworkBoundResource+Room完成数据层的缓存控制是一种常用方式。RemoteMediator则可以在Room中处理分页数据。对于需要同时使用这两个类来实现数据层的缓存控制的情况,可以使用以下解决方案。
示例代码:
class DataResource(val status: Status, val data: T?, val message: String?) {
enum class Status {
SUCCESS,
ERROR,
LOADING,
REFRESH
}
companion object {
fun success(data: T?): DataResource =
DataResource(Status.SUCCESS, data, null)
fun error(msg: String?, data: T?): DataResource =
DataResource(Status.ERROR, data, msg)
fun loading(data: T?): DataResource =
DataResource(Status.LOADING, data, null)
fun refresh(data: T?): DataResource =
DataResource(Status.REFRESH, data, null)
}
}
abstract class NetworkBoundResource {
fun asLiveData() = flow> {
emit(DataResource.loading(null))
val dbValue = loadFromDb().first()
if (shouldFetch(dbValue)) {
emit(DataResource.refresh(dbValue))
try {
fetchFromNetwork(dbValue?.let { getResultFromDb(it) }).collect { apiResponse->
when (apiResponse.status) {
Status.SUCCESS -> {
saveCallResult(apiResponse.data!!)
emitAll(loadFromDb().map {
DataResource.success(it)
})
}
Status.ERROR -> {
onFetchFailed()
emit(DataResource.error(apiResponse.message, dbValue))
}
Status.LOADING -> {
emit(Data