【发布时间】:2023-03-17 21:46:01
【问题描述】:
我有很多关于正确实现ViewModel 和LiveData 和Repository 的文章,但每一篇都是不同的。尽管谷歌文档说:
在数据层类中使用 LiveData 对象可能很诱人,但 LiveData 并非旨在处理异步数据流。
当它说数据层时,它意味着存储库。
我将展示我编写的一些代码以及我是如何实现这种模式的。我使用了下一个原则:
public class MovieViewModel extends ViewModel {
private LiveData<List<MovieModel>> mMovies;
private MutableLiveData<MovieModel> mMovieDetails;
private MovieDao movieDao;
Repository mRepo;
private MovieViewModel() {
this.movieDao = App.getAppdb().movieDao();
this.mRepo = Repository.getInstance();
mMovies = movieDao.getMovies();
}
public LiveData<MovieModel> getmMovieDetails(String movieId) {
if (mMovieDetails == null) {
mMovieDetails = mRepo.getMovieDetails(movieId);
}
return mMovieDetails;
}
还有存储库:
public class Repository {
public MutableLiveData<MovieModel> getMovieDetails(String id) {
MutableLiveData<MovieModel> tempMovieDetails = new MutableLiveData<>();
requests.getTvShowDetails(id).enqueue(new Callback<MovieModel>() {
@Override
public void onResponse(Call<MovieModel> call, Response<MovieModel> response) {
if (response.isSuccessful()) {
MovieModel movieDetails = response.body();
tempMovieDetails.postValue(movieDetails);
}
}
@Override
public void onFailure(Call<MovieModel> call, Throwable t) {
Log.d("ERROR:", t.getCause().toString());
}
});
return tempMovieDetails;
}
}
我已经删除了一些样板代码,因为它不在问题的范围内。
所以我的确切问题是,这是使用 Repository 实现 ViewModel 和 LiveData 的正确方法吗(在本例中,我使用 Retrofit 从 API 获取数据)即使我在 Repository 中创建 MutableLiveData 并且这显然违反了谷歌文档。如果它很糟糕,你能否为我提供一个干净的模式。
谢谢!
【问题讨论】:
标签: java android mvvm android-livedata android-viewmodel