Один метод получает ответ от WebServer, а другой метод требует ответа этого метода, чтобы вернуть что-то, и, к сожалению, я получил нулевой - PullRequest
0 голосов
/ 27 февраля 2020

В MainActivityViewModel классе у меня есть один метод Getter, который возвращает экземпляр CurrentWeather (класс pojo), и этот метод требует ответа от метода OnResponse, но я получаю нулевое значение в первый раз.

первый метод вызывается из MainActivity, viewModel не является нулевым, но экземпляр currentWeather имеет значение.

MainActivityViewModel viewModel = ViewModelProviders.of(this).get(MainActivityViewModel.class);
currentWeather = viewModel.getCurrentWeather();

Я не знаю, могу ли я попросить подождать секунду, прежде чем вернуть currentWeather в первом методе или нет.

public class MainActivityViewModel extends ViewModel implements Callback<ResponseBody> {

    private CurrentWeather currentWeather;

    public CurrentWeather getCurrentWeather() {
        if (currentWeather == null) {
            createCurrentWeather("London");
        }
        return currentWeather;
    }

    public void createCurrentWeather(String city) {
        RetrofitApiManager.getInstance().getCurrentWeatherApi(this, city);
    }

    @Override
    public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {

        if (response.isSuccessful()) {
            ResponseBody body = response.body();
            try {
                String serverResponde = body.string();
                Timber.e(serverResponde);
                Gson gson = new Gson();
                currentWeather = gson.fromJson(serverResponde, CurrentWeather.class);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void onFailure(Call<ResponseBody> call, Throwable t) {
    }
}

1 Ответ

0 голосов
/ 27 февраля 2020

Это потому, что требуется некоторое время, прежде чем ответ будет возвращен.

Обычно вам необходим объект LiveData для получения результатов от фоновых задач.

В вашем MainActivityViewModel добавьте следующее:

private MutableLiveData currentWeatherData = new MutableLiveData<CurrentWeather>();

public LiveData<CurrentWeather> getCurrentWeatherData() {
    return currentWeatherData;
}

Когда вы получите ответьте, обновите свои LiveData

currentWeather = gson.fromJson(serverResponde, CurrentWeather.class);
currentWeatherData.postValue(currentWeather);

В своей деятельности вам необходимо соблюдать эти LiveData.

viewModel.getCurrentWeatherData().observe(this, new Observer<CurrentWeather>() {
        @Override
        public void onChanged(CurrentWeather c) {
           // Do whatever you want with c.
        }
    });
...