Android Fragment LiveData 仅在屏幕旋转或配置更改后更新 - 使用 Java

问题描述 投票:0回答:1

我正在构建一个 Android 应用程序,用于显示从 API 获取的天气数据。我使用 WeatherViewModel 和 LiveData 来保留配置更改中的数据,并确保其显示在 WeatherFragment 中。但是,我遇到了一个问题,片段中的 TextView 仅在屏幕旋转或其他配置更改后更新天气数据。

当我单击“获取天气”按钮时,我希望 TextView 立即显示获取的天气数据,但它目前保持空白,直到我旋转屏幕或导致配置更改。

代码设置:

WeatherFragment.java:

在此片段中,我初始化 WeatherViewModel 并观察 onViewCreated 中的 getWeatherData()。 单击按钮时,我调用weatherViewModel.fetchWeatherData(city)来根据用户输入检索数据。

public class WeatherFragment extends Fragment {

    private WeatherViewModel weatherViewModel;
    private FragmentWeatherBinding binding;

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        binding = FragmentWeatherBinding.inflate(inflater, container, false);
        return binding.getRoot();
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        weatherViewModel = new ViewModelProvider(this).get(WeatherViewModel.class);

        binding.buttonFetchWeather.setOnClickListener(v -> {
            String city = binding.editTextCity.getText().toString().trim();
            if (!city.isEmpty()) {
                weatherViewModel.fetchWeatherData(city); // Retrieve weather data for the city
            } else {
                binding.textViewWeather.setText("Please enter a city name.");
            }
        });

        weatherViewModel.getWeatherData().observe(getViewLifecycleOwner(), weatherData -> {
            if (weatherData != null) {
                binding.textViewWeather.setText(weatherData);
            }
        });
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        binding = null; // Avoid memory leaks
    }
}

WeatherViewModel.java:

在 WeatherViewModel 中,我调用 fetchWeatherData(city) 来触发 API 调用并将结果设置在 MutableLiveData 中。

package com.example.weather;

import android.util.Log;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;

public class WeatherViewModel extends ViewModel {

    private final WeatherRepository repository;
    private MutableLiveData<String> weatherResult = new MutableLiveData<>();

    public WeatherViewModel() {
        repository = new WeatherRepository();
    }

    public void fetchWeatherData(String city) {
        weatherResult = repository.getWeather(city);
    }

    public LiveData<String> getWeather() {
        return weatherResult;
    }
}

我尝试过的:

将 getWeatherData() 的观察者移至 onCreateView,但行为是相同的。

问题:

为什么LiveData只有在配置更改后才会触发更新,如何确保单击按钮时TextView立即更新?该问题是否与 fetchWeatherData(city) 中的异步行为有关,如果是,如何使其触发立即更新?

任何帮助或见解将不胜感激!谢谢。

java android-studio mvvm android-livedata
1个回答
0
投票

您的 WeatherRepository 方法 getWeather(city) 应仅返回字符串。 fetchWeatherDate(city) 方法应该如下所示:

public void fetchWeatherData(String city) {
    String weatherString = repository.getWeather(city);
    weatherResult.setValue(weatherString);
}
© www.soinside.com 2019 - 2024. All rights reserved.