Android 无法使用使用改型2检索的对象在MutableLiveData中设置值
我正试图遵循Android架构指南来制作这个应用程序。我有一个MovieRepository,负责获取JSON(数据层),还有一个ViewModel,在我的MainActivity中为UI提供数据。我正在使用改型2来完成我的网络任务 电影定位码:Android 无法使用使用改型2检索的对象在MutableLiveData中设置值,android,retrofit2,android-livedata,Android,Retrofit2,Android Livedata,我正试图遵循Android架构指南来制作这个应用程序。我有一个MovieRepository,负责获取JSON(数据层),还有一个ViewModel,在我的MainActivity中为UI提供数据。我正在使用改型2来完成我的网络任务 电影定位码: public class MovieRepository { private static final String TAG = MovieRepository.class.getSimpleName(); public LiveD
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;
}
}
在onResponse(新回调)
中,我能够检索电影对象,并通过记录其一个属性值来证明它,因此存在一个有效的ReturnMovie对象。但是,在我的MainActivity
中,方法ReturnMovie movie=viewModel.getMovie(movieaputils.Endpoints.POPULAR_ENDPOINT).getValue()代码>给我一个空值。我到处检查,就是看不出问题出在哪里
其余代码在我的Github上:
您使用android架构组件,它在实时数据中使用可观察模式。如果您只是获取livedata的当前值,您不确定它是否已被处理。
而不是
ReturnMovie movie=viewModel.getMovie(movieaputils.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);
}
});
viewModel.getMovie(movieaputils.Endpoints.POPULAR_ENDPOINT).observe(这是一个新的观察者(){
@凌驾
更改后的公共无效(@Nullable ReturnMovie){
//对电影做些什么
doSomething(电影);
}
});
您不必管理取消订阅,因为体系结构组件本身管理活动的取消订阅
看看:
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;
}
}
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....
}
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);
}
});