我正在构建一个 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) 中的异步行为有关,如果是,如何使其触发立即更新?
任何帮助或见解将不胜感激!谢谢。
您的 WeatherRepository 方法 getWeather(city) 应仅返回字符串。 fetchWeatherDate(city) 方法应该如下所示:
public void fetchWeatherData(String city) {
String weatherString = repository.getWeather(city);
weatherResult.setValue(weatherString);
}