Невозможно установитьValue в MutableLiveData, используя объект, полученный с помощью Retrofit 2 - PullRequest
0 голосов
/ 13 мая 2018

Я пытаюсь следовать принципам архитектуры Android, чтобы сделать это приложение.У меня есть MovieRepository, который отвечает за выборку JSON (слой данных), и у меня есть ViewModel, который предоставляет данные для пользовательского интерфейса в моей MainActivity.Я использую модификацию 2 для своей сетевой задачи.

Код репозитория Movie:

public class MovieRepository {

    private static final String TAG = MovieRepository.class.getSimpleName();

    public LiveData<ReturnMovie> search(String term) {
        final MutableLiveData<ReturnMovie> data = new MutableLiveData<>();

        MovieService service = ServiceGenerator.createService(MovieService.class);
        Call<ReturnMovie> call = service.requestMovie(term, MovieAPIUtils.KEY);

        call.enqueue(new Callback<ReturnMovie>() {
            @Override
            public void onResponse(Call<ReturnMovie> call, Response<ReturnMovie> response) {
                ReturnMovie movie = response.body();
                data.setValue(movie);
                Log.d(TAG, data.getValue().getPage().toString());
            }
            @Override
            public void onFailure(Call<ReturnMovie> call, Throwable t) {
                Log.d(TAG, t.toString());
            }
        });
        return data;
    }
}

MovieService:

public interface MovieService {

    @GET(MovieAPIUtils.Path.MOVIE_PATH + "/{param}")
    Call<ReturnMovie> requestMovie (@Path("param") String endpoints,
                                    @Query(MovieAPIUtils.Query.API_QUERY) String key);

}

ViewModel:

public class MainActivityMovieViewModel extends ViewModel {

    private static final String TAG = MainActivityMovieViewModel.class.getSimpleName();

    private LiveData<ReturnMovie> movie;
    private MovieRepository repo = new MovieRepository();

    public LiveData<ReturnMovie> getMovie(String searchTerm) {

        if (movie == null) {
            movie = repo.search(searchTerm);
        }

        return movie;
    }
}

MainActivity:

public class MainActivity extends AppCompatActivity implements MovieAdapter.MovieOnClickListener {

    private RecyclerView mRecyclerView;
    private MovieAdapter mMovieAdapter;
    private MainActivityMovieViewModel viewModel;
    private static final String TAG = MainActivity.class.getSimpleName();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        viewModel = ViewModelProviders.of(this).get(MainActivityMovieViewModel.class);
        initRecyclerViewWithMovies();

        ReturnMovie movie = viewModel.getMovie(MovieAPIUtils.Endpoints.POPULAR_ENDPOINT).getValue();

// other code....

    }

В onResponse(new Callback<ReturnMovie>) мне удалось получить объект фильма, и я доказал его, зарегистрировав одно из значений его свойств, поэтому существует действительный объект ReturnMovie.Однако в моем MainActivity метод ReturnMovie movie = viewModel.getMovie(MovieAPIUtils.Endpoints.POPULAR_ENDPOINT).getValue(); дает мне ноль.Я проверял везде, просто не вижу, где проблема.

Остальная часть кода на моем Github: https://github.com/brendoncheung/PopularMovie/tree/mvvm_approach

1 Ответ

0 голосов
/ 13 мая 2018

Вы используете компоненты архитектуры Android, которые используют наблюдаемый шаблон в живых данных.Если вы просто получаете текущее значение liveata, вы не уверены, что оно было обработано.Вместо ReturnMovie movie = viewModel.getMovie(MovieAPIUtils.Endpoints.POPULAR_ENDPOINT).getValue(); я думаю, что вы должны использовать

viewModel.getMovie(MovieAPIUtils.Endpoints.POPULAR_ENDPOINT).observe(this, new Observer<ReturnMovie>() {
        @Override
        public void onChanged(@Nullable ReturnMovie movie) {
          //do stuff with the movie
          doSomething(movie);
        }
    });    

Вам не нужно управлять отпиской, так как компонент архитектуры сам управляет отпиской для действий

Посмотрите: https://developer.android.com/topic/libraries/architecture/livedata

...