Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 无法使用使用改型2检索的对象在MutableLiveData中设置值_Android_Retrofit2_Android Livedata - Fatal编程技术网

Android 无法使用使用改型2检索的对象在MutableLiveData中设置值

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

我正试图遵循Android架构指南来制作这个应用程序。我有一个MovieRepository,负责获取JSON(数据层),还有一个ViewModel,在我的MainActivity中为UI提供数据。我正在使用改型2来完成我的网络任务

电影定位码:

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);
        }
    });