Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.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
Java 为什么LiveData在ViewModel中返回null?_Java_Android - Fatal编程技术网

Java 为什么LiveData在ViewModel中返回null?

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获取值时,它是否返回null

主要活动

**

下面是我的错误://尝试调用虚拟方法“java.util.List” null对象上的com.xllnc.mvvmexample.entity.ApiResponse.getIssues 参考文献

**

视图模型

存储库


不要将存储库中的方法中的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);
    }