Java 为什么LiveData在ViewModel中返回null?
当我尝试从LiveData获取值时,它是否返回null 主要活动 ** 下面是我的错误://尝试调用虚拟方法“java.util.List” null对象上的com.xllnc.mvvmexample.entity.ApiResponse.getIssues 参考文献 ** 视图模型 存储库Java 为什么LiveData在ViewModel中返回null?,java,android,Java,Android,当我尝试从LiveData获取值时,它是否返回null 主要活动 ** 下面是我的错误://尝试调用虚拟方法“java.util.List” null对象上的com.xllnc.mvvmexample.entity.ApiResponse.getIssues 参考文献 ** 视图模型 存储库 不要将存储库中的方法中的liveData设为最终版当您尝试同步获取响应时,您的问题是Rest api或改装调用的异步性质 public void loadIssues(String user, Strin
不要将存储库中的方法中的liveData设为最终版当您尝试同步获取响应时,您的问题是Rest api或改装调用的异步性质
public void loadIssues(String user, String repo){
ApiResponse response = mIssueRepository.getIssues(user, repo).getValue();
mApiResponse.setValue(response);
}
设置ApiResponse,即使它未从服务中检索
使用Transformations.switchMap获取响应并正确观察它。但是为什么,当我调用misseurepository.getIssues时,它将发出请求并获取LiveData。然后我把它设为MutableLiveData?是吗?@Rarity7-您的代码看起来与指南中的代码相似。检查UserRepository。只需在loadIssues中返回livedata,并在activity中观察它。最初没有数据,后来有数据时设置值。所以,当您有数据时,请设置适配器;它具有空值,您可以使用此空值设置mApiResponse.setValueresponse,并尝试从MainActivity中的空值获取列表。您也可以使用ifapiResponse!=在observe Method中为null正如我在回答中所说的,调用结果之间可能有几毫秒的间隔,但您最初将数据设置为null,这就是问题所在。使用Transition.switchMap(也使用MediatorLiveData)是解决方案之一,或者您可以检查null。
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);
}
}
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;
}
}
public void loadIssues(String user, String repo){
ApiResponse response = mIssueRepository.getIssues(user, repo).getValue();
mApiResponse.setValue(response);
}