MutableliveData возвращает ноль из хранилища в singleLiveEvent - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь позвонить в сеть по нажатию кнопки. Я использую оболочку singleLiveEvent, потому что данные нужно отправлять на сервер и получать ответ только по нажатию кнопки. Я использую залп для вызовов 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;
}

Я хочу, чтобы данные отправлялись только при нажатии кнопки, а не в начале действия.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Вы устанавливаете значение responseSingleLiveEvent в начальном значении ViewModal LiveData, заданном хранилищем, которое всегда равно NULL. Вам нужно послушать в viewmodel нечто подобное, что я делаю в своем демонстрационном приложении.

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

Или вы можете передать контекст из действия в viewmodel для наблюдения и проверки, если он получен. Вы можете увидеть полную версию здесь

Viewmodel наблюдать данные в реальном времени

0 голосов
/ 06 февраля 2019

Ваш сетевой запрос асинхронный, но ваш метод setResponseSingleLiveEvent() не ожидает его завершения, прежде чем проверять возвращаемое значение LiveData.

Возможно, вы захотите, чтобы ViewModel проходил через LiveData из репозитория, чтобы «View» (Activity / Fragment) мог подписаться непосредственно на него:

public void onPasswordChanged(String url, Map param) {
    responseLiveData = mRepository.changeUserPassword(url, param);
}

Возможно, вы захотите установить какой-то статус «загрузки» в объекте LiveData, когда сетевой запрос находится в полете. У Google есть пример чего-то подобного здесь: https://developer.android.com/jetpack/docs/guide#addendum

Если вы хотите использовать SingleLiveEvent только для уведомления представления о завершении ответа, вы, вероятно, можете использовать Transformations.map() для сопоставления результата с событием.

...