首页 > 解决方案 > 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;
}

我希望仅在单击按钮时发送数据,而不是在活动开始时发送。

标签: androidandroid-volleyandroid-architecture-componentsmutablelivedataandroid-livedata

解决方案


您的网络请求是异步的,但您的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()将结果映射到事件。


推荐阅读