android - MutableliveData 从存储库返回 null 到 singleLiveEvent
问题描述
我正在尝试单击按钮调用网络。我正在使用 singleLiveEvent 包装器,因为需要将数据发送到服务器并仅在单击按钮时才检索响应。我正在使用 Volley 进行 GET 和 POST 调用。我在存储库上得到响应,但在 onChanged 方法上没有。它从存储库中获取空值。
视图模型类
public void setResponseSingleLiveEvent(String url,Map param){
responseSingleLiveEvent.setValue(mRepository.changeUserPassword(url,param).getValue());
}
存储库类
public MutableLiveData<CommonServerResponse> changeUserPassword(String url, Map params) {
this.postParams = params;
final MutableLiveData<CommonServerResponse> responseMutableLiveData = new MutableLiveData<>();
VolleycustomRequest<CommonModel> volleycustomRequest = new VolleycustomRequest<CommonModel>(Request.Method.POST,
url, CommonModel.class,
(Response.Listener<CommonModel>)
response -> {
Log.d(TAG, "changeUserPassword: "+response);
responseMutableLiveData.setValue(new CommonServerResponse(response));
},
error -> {
responseMutableLiveData.setValue(new CommonServerResponse(VolleyErrorHelper.getMessage(error)));
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
return params;
}
};
AppController.getInstance().addToRequestque(volleycustomRequest);
return responseMutableLiveData;
}
我希望仅在单击按钮时发送数据,而不是在活动开始时发送。
解决方案
您的网络请求是异步的,但您的setResponseSingleLiveEvent()
方法在检查返回的 LiveData 值之前不会等待它完成。
您可能希望 ViewModel 通过存储库中的 LiveData,以便“视图”(活动/片段)可以直接订阅它:
public void onPasswordChanged(String url, Map param) {
responseLiveData = mRepository.changeUserPassword(url, param);
}
当网络请求正在进行时,您可能希望在 LiveData 对象中设置某种“加载”状态。谷歌在这里有一个类似的例子:https ://developer.android.com/jetpack/docs/guide#addendum
如果您只想在响应完成时使用 SingleLiveEvent 通知视图,您可能会使用Transformations.map()
将结果映射到事件。
推荐阅读
- python - 如何在 Python 中运行 shell 命令?
- tensorflow - 如何使用 tensorflow 数据集训练 sklearn 模型?
- apache-kafka - 当 min.compaction.lag.ms 大于 log.cleaner.max.compaction.lag.ms 时会发生什么?
- typescript - TypeScript:使用没有类型变量的条件类型
- swift - 如何在 swift 中将类自定义初始化程序与协调器一起使用
- linux - 当我从服务器 scp 到名称时,我的文件夹在哪里复制
- mysql - 如何检索相同数据 ID 的最大值
- r - 使用向量根据名称选择多个列表元素
- file-upload - ReactPHP --> 文件上传 --> $request->getUploadedFiles() 返回空数组
- flutter - 如何将数组 id 转换为 json Flutter 中的列表元素