Di kelas MainActivityViewModel saya memiliki satu metode Getter yang mengembalikan turunan CurrentWeather (kelas pojo) dan metode ini memerlukan respons dari metode OnResponse tetapi saya mendapatkan nol untuk pertama kalinya.

Metode pertama yang dipanggil dari MainActivity, viewModel bukan null tetapi instance currentWeather adalah.

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

Saya tidak tahu apakah saya dapat meminta untuk menunggu sebentar sebelum mengembalikan currentWeather dalam metode pertama atau tidak.

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) {
    }
}
0
Amir Hossein 27 Februari 2020, 21:01

1 menjawab

Jawaban Terbaik

Itu karena butuh beberapa saat sebelum respon dikembalikan.

Biasanya, Anda memerlukan objek LiveData untuk mendapatkan hasil dari tugas latar belakang.

Di MainActivityViewModel Anda, tambahkan yang berikut ini:

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

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

Saat Anda mendapat tanggapan, perbarui LiveData Anda

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

Dalam aktivitas Anda, Anda perlu mengamati LiveData ini.

viewModel.getCurrentWeatherData().observe(this, new Observer<CurrentWeather>() {
        @Override
        public void onChanged(CurrentWeather c) {
           // Do whatever you want with c.
        }
    });
0
Loremar Marabillas 27 Februari 2020, 20:03