【问题标题】:Correct way to implement ViewModel and LiveData with Repository in android using java?使用java在android中使用Repository实现ViewModel和LiveData的正确方法?
【发布时间】:2023-03-17 21:46:01
【问题描述】:

我有很多关于正确实现ViewModelLiveDataRepository 的文章,但每一篇都是不同的。尽管谷歌文档说:

在数据层类中使用 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


    【解决方案1】:

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

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

    【讨论】:

    • 是的,我有用于其他加载的房间数据库,我使用 viewmodel 制作,非常好。但是,这个问题是关于当我们调用 API(使用 Retrofit)时 ViewModel 和 Repository 是如何相互通信的。更准确地说,将数据从存储库发布到 LiveData 对象的正确方法是什么,以便我可以从 viewmodel 获取 LiveData。在谷歌文档中,它说你不应该在存储库中创建 LiveData 或 MutableLiveData 对象。因此,如果我不能在 Repository 中创建 MutableLiveData 对象,我该如何将它们与 ViewModel 类连接起来。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 2018-10-20
    • 2014-01-20
    • 2022-01-15
    • 2021-01-19
    相关资源
    最近更新 更多