【问题标题】:MVVM - response List does not contain any valuesMVVM - 响应列表不包含任何值
【发布时间】:2020-06-28 14:06:17
【问题描述】:

我只是想学习 mvvm,但遇到了一些问题 - 我的列表应该包含来自 API 的响应是空的。我不确定为什么会这样。这是一些代码:

MainActivity

mViewModel = new ViewModelProvider(this).get(ViewModel.class);
    mViewModel.getData().observe(this, new Observer<List<Model>() {
    @Override
    public void onChanged(List<Model> list) {
        if (data.size() > 0) {
            data.clear();
        }
        if (list != null) {
            data.addAll(list);
            Log.i(TAG, "onChanged: " + data.size());
        }
    }
});

视图模型

private Repository mRepository;
private MutableLiveData<List<Model> liveData;

public ViewModel(@NonNull Application application) {
    super(application);
    mRepository = Repository.getInstance();
    liveData = mRepository.getData();
}

public MutableLiveData<List<Model> getData(){
    return liveData;
}

存储库

 public MutableLiveData<List<Model>> getData(){

    MutableLiveData<List<Model> mLiveData = new MutableLiveData<>();

    mApiCall.callApi()
            .enqueue(new Callback<List<Model>() {
                @Override
                public void onResponse(Call<List<Model> call, Response<List<Model> response) {
                    mLiveData.setValue(response.body());
                }
                @Override
                public void onFailure(Call<List<Model> call, Throwable t) {
                    t.getMessage();
                }
            });
    return mLiveData;
}

【问题讨论】:

  • response.body() 可以返回空列表。您是否验证响应列表不为空?
  • 我认为您正在尝试观察 Mu​​tableLiveData,您应该在其中观察 LiveData。
  • 嗯,我想是的。我正在使用 HttpLoggerInterceptor,从日志中我可以看到一切正常,我的意思是整个连接都正常。我也尝试在 LiveList 为空时返回一些日志,但我没有收到任何日志,所以我认为响应不是 null/empty
  • 我敢说 MutableLiveData 没问题。我在类似的项目中使用过,一切都很好。
  • 请不要破坏您的帖子。如果你不想要它,你可以删除它

标签: java android mvvm retrofit


【解决方案1】:

在 getData() 函数中,您正在返回实时数据,并且在您的视图模型中的这一行中:

liveData = mRepository.getData();

您将其分配给 liveDate,这是在您的视图模型中创建的可变实时数据,问题就在这里。 当这个赋值发生时,视图模型中 liveData 变量中的观察者将被删除,这就是我们应该像这样使用 switchMap 的原因:

private var result : LiveData<List<Response>> = MutableLiveData()
    result : LiveData<Response> = Transformations.map(mRepository.getData()){
     it
}

现在你需要做的就是像这样在你的视图中观察 repo:

viewmodel.result.observe(this, Observer{ list ->
// to do with the result
})

【讨论】:

    【解决方案2】:
    1. response.body() 将提供 APIResponse 类。但是您需要作为响应的是列表。 要获得 List 的预期响应,请尝试 response.body().getMetadata().getResults()

    2. 也可以是存储库初始化。尝试创建

       public void init() {
           mRepository = Repository.getInstance();
           liveData = mRepository.getData();
       }
      

    使用viewModel.init();

    1. 模型类属性应与响应 JSON 字段匹配,以从响应中获取模型对象。

    在 response.body() 上调试并查看数据。如果模型为空,则字段将不匹配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-26
      • 1970-01-01
      • 1970-01-01
      • 2021-12-16
      相关资源
      最近更新 更多