首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何向LiveData添加数据

如何向LiveData添加数据
EN

Stack Overflow用户
提问于 2020-05-13 05:49:53
回答 3查看 43关注 0票数 0

在MainActivity中,我一个接一个地调用两个方法,这是代码getAddress方法:

代码语言:javascript
运行
复制
public class RemoteRepository {

    private ApiRequest apiRequest;
    private LiveData<List<AddressResponse>> allAddresses = new MutableLiveData<>();

    public RemoteRepository() {
        apiRequest = RetrofitRequest.getInstance().create(ApiRequest.class);
    }

    public LiveData<List<AddressResponse>> getAddresses() {
        return allAddresses;
    }

    public void getAddress(double query1, double query2) {

        apiRequest.getAddress(query1, query2)
                .enqueue(new Callback<AddressResponse>() {
                    @Override
                    public void onResponse(Call<AddressResponse> call, Response<AddressResponse> response) {

                        if(response.body() != null) {
                            allAddresses.getValue().add(response.body());
                        }
                    }

                    @Override
                    public void onFailure(Call<AddressResponse> call, Throwable t) {

                    }
                });

    }
}

不幸的是,我得到了以下错误:java.lang.NullPointerException: Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' on a null object reference

有没有办法将每次调用的数据添加到LiveData<List<AddressResponse>> allAddresses

EN

回答 3

Stack Overflow用户

发布于 2020-05-13 05:59:38

我相信这就是你需要改变的

代码语言:javascript
运行
复制
allAddresses.getValue().add(response.body());

要这样做:

代码语言:javascript
运行
复制
allAddresses.postValue(response.body())
票数 1
EN

Stack Overflow用户

发布于 2020-05-13 06:11:06

首先,最好在getter方法中创建LiveData的实例,而不是在类的顶部创建,如下所示:

代码语言:javascript
运行
复制
Public LiveData<List<ResponseAddress> getAddress(){
     if(allAddress == Null)
          allAddress = new MutableLiveData ();         
     return allAddress;
 }

然后确保您的响应正文不为空:

代码语言:javascript
运行
复制
if(response.body() != null ){
      // Replacement Bellow
  }

在if语句体中,只需替换:

代码语言:javascript
运行
复制
allAddresses.getValue().add(response.body());

有了这个:

代码语言:javascript
运行
复制
allAddresses.setValue(response.body());
票数 0
EN

Stack Overflow用户

发布于 2020-05-13 06:32:12

如果想要在值发生变化时向应用程序的主线程发布或添加任务,则使用:

代码语言:javascript
运行
复制
allAddresses.postValue(response.body())

而setValue()方法用于设置更改的值,即更改值将被分派给应用程序的活动观察者:

代码语言:javascript
运行
复制
allAddresses.setValue(response.body()) 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61762624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档