使用java在android中使用Repository实现ViewModel和LiveData的正确方法



我有很多关于用Repository正确实现ViewModelLiveData的文章,但每一篇都不一样。他们中的大多数人都在存储库中创建MutableLiveData,尽管谷歌文档上写着:

在数据层类中使用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的正确方法吗(在本例中,我使用Reform从API获取数据(,尽管我在Repository中制作了MutableLiveData,这显然违反了google文档。如果情况不好,你可以给我一个干净的模式。

谢谢!

MVVM体系结构是一种模型-视图-视图-模型体系结构,它消除了每个组件之间的紧密耦合。最重要的是,在这个体系结构中,子级没有对父级的直接引用,它们只有可观察性的引用

因此,我建议您在活动中返回调用,而不是返回MutableLiveData。如果使用本地数据库,您可以从viewModel返回实时数据,并在活动中观察实时数据。

最新更新