0

我正在尝试单击按钮调用网络。我正在使用 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;
}

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

4

2 回答 2

0

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

于 2019-02-06T00:16:00.897 回答
0

您在 ViewModal 的 LiveData 初始值中设置 responseSingleLiveEvent 值,该初始值由存储库给出,该值始终为 NULL。您需要在视图模型中收听类似我在演示应用程序中所做的事情。

  suspend fun getMovieDetail(movieId: String): LiveData<Movie> {
    moviesRepository.getMovieDetail(movieId).observeForever {
        if (it?.status == null) {
            moviesRepository.fetchFullMovieDetails(movieId, addedTime)
        }
    }
   return moviesRepository.getMovieDetail(movieId)
}

或者您可以将上下文从活动传递到视图模型以观察并检查是否收到。你可以在这里看到完整版

Viewmodel 观察 livedata

于 2019-02-07T19:20:14.370 回答