当我试图从中获取价值时,我的LiveData <>返回null?
MainActivity
**
Here is my error: //Attempt to invoke virtual method 'java.util.List com.xllnc.mvvmexample.entity.ApiResponse.getIssues()' on a null object reference
**
mViewModel = ViewModelProviders.of(this).get(ListIssueViewModel.class);
mViewModel.getApiResponse().observe(this, apiResponse -> mAdapter.addIssues(apiResponse.getIssues()));
mViewModel.loadIssues("square", "retrofit");
ViewModel
public class ListIssueViewModel extends ViewModel {
private MutableLiveData<ApiResponse> mApiResponse;
private IssueRepository mIssueRepository;
public ListIssueViewModel(){
mApiResponse = new MediatorLiveData<>();
mIssueRepository = new IssueRepositoryImpl();
}
public LiveData<ApiResponse> getApiResponse(){
return mApiResponse;
}
public void loadIssues(String user, String repo){
ApiResponse response = mIssueRepository.getIssues(user, repo).getValue();
mApiResponse.setValue(response);
}
}
Repository
public class IssueRepositoryImpl implements IssueRepository {
public static final String BASE_URL = "https://api.github.com/";
private GitHubApiService mApiService;
public IssueRepositoryImpl(){
Retrofit retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(BASE_URL)
.build();
mApiService = retrofit.create(GitHubApiService.class);
}
public LiveData<ApiResponse> getIssues(String owner, String repo) {
final MutableLiveData<ApiResponse> liveData = new MutableLiveData<>();
Call<List<Issue>> call = mApiService.getIssues(owner, repo);
call.enqueue(new Callback<List<Issue>>() {
@Override
public void onResponse(Call<List<Issue>> call, Response<List<Issue>> response) {
liveData.setValue(new ApiResponse(response.body()));
}
@Override
public void onFailure(Call<List<Issue>> call, Throwable t) {
liveData.setValue(new ApiResponse(t));
}
});
return liveData;
}
}
分析解答
当您尝试同步获取response时,您的问题是关于Rest api或改装调用的异步性质。
public void loadIssues(String user, String repo){
ApiResponse response = mIssueRepository.getIssues(user, repo).getValue();
mApiResponse.setValue(response);
}
设置ApiResponse,即使它没有从服务中检索。
使用Transformations.switchMap
获取response并正确观察它。