【问题标题】:Live Data is not updating ViewModel实时数据未更新 ViewModel
【发布时间】:2018-12-19 12:21:12
【问题描述】:

我正在Activity 中观察我的视图模型:

private void setupViewModel() {
    SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
    mSortCategory = sharedPreferences.getString(getString(R.string.pref_sort_key), getString(R.string.pref_sort_popular));
    MainViewModelFactory factory = new MainViewModelFactory(mSortCategory);
    mViewModel = ViewModelProviders.of(this, factory).get(MainViewModel.class);
    mViewModel.getResponse().observe(this, new Observer<MovieResponse>() {
        @Override
        public void onChanged(MovieResponse movieResponse) {
            mMovieAdapter.setData(movieResponse.getResults());
            mCurrentPage = movieResponse.getPage();
            mTotalPages = movieResponse.getTotalPages();
            Log.d(TAG, "setupviewmodel: " + movieResponse.getResults().get(0).getOriginalTitle());
        }
    });

这是我的虚拟机:

public class MainViewModel extends ViewModel {
private MutableLiveData<MovieResponse> mMoviesResponseLiveData;

public MainViewModel(String category) {
    mMoviesResponseLiveData = Repository.getInstance().loadMoviesFromApi(category, 1);
}

public void loadMovies(String category, int currentPage) {
    mMoviesResponseLiveData = Repository.getInstance().loadMoviesFromApi(category, currentPage);
}

public MutableLiveData<MovieResponse> getResponse() {
    return mMoviesResponseLiveData;
}

我在这里打电话给retrofit

 public MutableLiveData<MovieResponse> loadMoviesFromApi(String sort, int page) {
    final MutableLiveData<MovieResponse> data = new MutableLiveData<>();
    Call<MovieResponse> call = mApiService.getMoviesResponse(sort, BuildConfig.OPEN_WEATHER_MAP_API_KEY, page);
    Log.d(TAG, "loadMoviesFromApi: " + call.request().url().toString());
    call.enqueue(new Callback<MovieResponse>() {
        @Override
        public void onResponse(Call<MovieResponse> call, Response<MovieResponse> response) {
            if (response.isSuccessful()) {
                data.setValue(response.body());
            }
        }
        @Override
        public void onFailure(Call<MovieResponse> call, Throwable t) {
            t.printStackTrace();
        }
    });
    return data;
}

据我了解,新数据应通过从 Viewmodel 上的活动调用方法来异步加载:

private void updateUI() {
    mViewModel.loadMovies(mSortCategory, mCurrentPage);
}

我从retrofit 接收数据。但由于某种原因,没有观察到 Livedata。

【问题讨论】:

    标签: android retrofit android-lifecycle android-livedata


    【解决方案1】:

    由于这种方法,您的观察者没有收到通知:

    public void loadMovies(String category, int currentPage) {
        mMoviesResponseLiveData = Repository.getInstance().loadMoviesFromApi(category, currentPage);
    }
    

    loadMoviesFromApi 返回 LiveData 的新实例,因此您的 viewModel 不再引用从 getResponse 返回的 LiveData。如果你希望你的观察者得到通知,你应该从方法 loadMovies 返回 ViewModel 并观察它或调用 mMoviesResponseLiveData.postValue(responseFromRetrofit)

    【讨论】:

    • 谢谢。所以现在我在 Repository 中创建了一个字段并将数据设置为它。观察到创建 ViewModel 时返回的第一个 Live 数据实例。
    猜你喜欢
    • 2020-12-31
    • 1970-01-01
    • 2017-02-13
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多