Я пытаюсь следовать принципам архитектуры 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