来自房间的 LiveData 和 MutableLiveData 以显示错误消息
LiveData from room and MutableLiveData to display error message
可以在以下位置找到源代码:https://github.com/AliRezaeiii/TVMaze
我有以下存储库 class :
class ShowRepository(
private val showDao: ShowDao,
private val api: TVMazeService
) {
/**
* A list of shows that can be shown on the screen.
*/
val shows: LiveData<List<Show>> =
Transformations.map(showDao.getShows()) {
it.asDomainModel()
}
/**
* Refresh the shows stored in the offline cache.
*/
suspend fun refreshShows(): Result<List<Show>> = withContext(Dispatchers.IO) {
try {
val news = api.fetchShowList().await()
showDao.insertAll(*news.asDatabaseModel())
Result.Success(news)
} catch (err: HttpException) {
Result.Error(err)
}
}
}
据我了解,Room 不支持 MutableLiveData,而是支持 LiveData。所以我在我的 ViewModel 中创建了两个对象来观察:
class MainViewModel(
private val repository: ShowRepository,
app: Application
) : AndroidViewModel(app) {
private val _shows = repository.shows
val shows: LiveData<List<Show>>
get() = _shows
private val _liveData = MutableLiveData<Result<List<Show>>>()
val liveData: LiveData<Result<List<Show>>>
get() = _liveData
/**
* init{} is called immediately when this ViewModel is created.
*/
init {
if (isNetworkAvailable(app)) {
viewModelScope.launch {
_liveData.postValue(repository.refreshShows())
}
}
}
}
我使用 show
LiveData varialbe 在我的 Activity 中提交列表:
viewModel.shows.observe(this, Observer { shows ->
viewModelAdapter.submitList(shows)
})
并且我使用 LiveData
变量在存储库 refreshShows()
中发生异常时显示错误消息:
viewModel.liveData.observe(this, Observer { result ->
if (result is Result.Error) {
Toast.makeText(this, getString(R.string.failed_loading_msg), Toast.LENGTH_LONG).show()
Timber.e(result.exception)
}
})
您认为在 ViewModel 中使用一个 LiveData 而不是两个有更好的解决方案吗?
我认为您可以改进您的代码,以此 repo 作为基础。它使用使用实时数据的单一真实来源策略。我认为您将不得不稍微挖掘一下 repo 才能理解代码,但总而言之,这段代码将从 api 获取数据,存储在您的房间中,并作为结果提供您的房间查询答案,所以观察这个就可以了。
可以在以下位置找到源代码:https://github.com/AliRezaeiii/TVMaze
我有以下存储库 class :
class ShowRepository(
private val showDao: ShowDao,
private val api: TVMazeService
) {
/**
* A list of shows that can be shown on the screen.
*/
val shows: LiveData<List<Show>> =
Transformations.map(showDao.getShows()) {
it.asDomainModel()
}
/**
* Refresh the shows stored in the offline cache.
*/
suspend fun refreshShows(): Result<List<Show>> = withContext(Dispatchers.IO) {
try {
val news = api.fetchShowList().await()
showDao.insertAll(*news.asDatabaseModel())
Result.Success(news)
} catch (err: HttpException) {
Result.Error(err)
}
}
}
据我了解,Room 不支持 MutableLiveData,而是支持 LiveData。所以我在我的 ViewModel 中创建了两个对象来观察:
class MainViewModel(
private val repository: ShowRepository,
app: Application
) : AndroidViewModel(app) {
private val _shows = repository.shows
val shows: LiveData<List<Show>>
get() = _shows
private val _liveData = MutableLiveData<Result<List<Show>>>()
val liveData: LiveData<Result<List<Show>>>
get() = _liveData
/**
* init{} is called immediately when this ViewModel is created.
*/
init {
if (isNetworkAvailable(app)) {
viewModelScope.launch {
_liveData.postValue(repository.refreshShows())
}
}
}
}
我使用 show
LiveData varialbe 在我的 Activity 中提交列表:
viewModel.shows.observe(this, Observer { shows ->
viewModelAdapter.submitList(shows)
})
并且我使用 LiveData
变量在存储库 refreshShows()
中发生异常时显示错误消息:
viewModel.liveData.observe(this, Observer { result ->
if (result is Result.Error) {
Toast.makeText(this, getString(R.string.failed_loading_msg), Toast.LENGTH_LONG).show()
Timber.e(result.exception)
}
})
您认为在 ViewModel 中使用一个 LiveData 而不是两个有更好的解决方案吗?
我认为您可以改进您的代码,以此 repo 作为基础。它使用使用实时数据的单一真实来源策略。我认为您将不得不稍微挖掘一下 repo 才能理解代码,但总而言之,这段代码将从 api 获取数据,存储在您的房间中,并作为结果提供您的房间查询答案,所以观察这个就可以了。