java - 从 Web Api 服务获取数据时,为什么屏幕旋转上的 savedInstanceState 不起作用?
问题描述
我有一个简单的活动,我想在屏幕旋转时保存它的状态,但它不保存状态。我试图以应有的方式实现 savedOnInstanceState 方法。我想念什么吗?或者,如果我从 Web API 服务获取数据,它就不起作用。
这是活动的代码。任何帮助表示赞赏!
public class WeatherActivity extends AppCompatActivity {
TextView mTvTemperature, mTextView, mTvHumidity;
EditText mEdTxtCityName;
Button btnSearch;
String ApiUrl = "api.openweathermap.org/data/2.5/weather?q={city name}&appid={API key}";
String ApiKey = "c9647f24a1a86a20e31a792fa58dea04";
private static final String KEY_TEMPERATURE = "temperature";
private static final String KEY_HUMIDITY = "humidity";
private static final String KEY_CITY_NAME = "city_name";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_weather);
AndroidNetworking.initialize(getApplicationContext());
mTextView = findViewById(R.id.tv_weather_activity);
btnSearch = findViewById(R.id.btn_search_city);
mEdTxtCityName = findViewById(R.id.editText_cityName);
mTvTemperature = findViewById(R.id.tv_temperature);
mTvHumidity = findViewById(R.id.tv_humidity);
btnSearch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
getWeatherSearch(view);
}
});
if(savedInstanceState !=null){
String savedTemperature = savedInstanceState.getString(KEY_TEMPERATURE);
mTvTemperature.setText(savedTemperature);
String savedHumidity = savedInstanceState.getString(KEY_HUMIDITY);
mTvHumidity.setText(savedHumidity);
String savedCityName = savedInstanceState.getString(KEY_CITY_NAME);
mEdTxtCityName.setText(savedCityName);
}
}
public void getWeatherSearch(View view) {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.openweathermap.org/data/2.5/")
.addConverterFactory(GsonConverterFactory.create())
.client(client)
.build();
WeatherApi service = retrofit.create(WeatherApi.class);
String cityNameFromIntent = getIntent().getStringExtra("CityName");
String cityNameString = (cityNameFromIntent != null) ? cityNameFromIntent : mEdTxtCityName.getText().toString().trim();
Call<WeatherModel> weatherService = service.getWeatherApi(cityNameString, ApiKey);
weatherService.enqueue(new Callback<WeatherModel>() {
@Override
public void onResponse(Call<WeatherModel> call, Response<WeatherModel> response) {
if (response.code() == 404){
Toast.makeText(WeatherActivity.this, "Enter a valid City name", Toast.LENGTH_SHORT).show();
}else if (!(response.isSuccessful() )){
Toast.makeText(WeatherActivity.this, response.code(), Toast.LENGTH_SHORT).show();
}
WeatherModel weatherModel = response.body();
Main main = weatherModel.getMain();
Double temperature = main.getTemp();
Integer celsius = (int) (temperature-273.15);
mTvTemperature.setText(String.valueOf(celsius) + " °C");
Integer feelsLike = main.getHumidity();
mTvHumidity.setText(String.valueOf(feelsLike));
}
@Override
public void onFailure(Call<WeatherModel> call, Throwable t) {
Toast.makeText(WeatherActivity.this, t.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onSaveInstanceState(@NonNull Bundle outState, @NonNull PersistableBundle outPersistentState) {
super.onSaveInstanceState(outState, outPersistentState);
outState.putString(KEY_TEMPERATURE, mTvTemperature.getText().toString());
outState.putString(KEY_HUMIDITY, mTvHumidity.getText().toString());
outState.putString(KEY_CITY_NAME, mEdTxtCityName.getText().toString());
}
界面:
public interface WeatherApi {
@GET("weather")
Call<WeatherModel> getWeatherApi(@Query("q") String cityname, @Query("appid") String apikey );
}
模型类:
public class WeatherModel {
@SerializedName("main")
Main main;
public Main getMain() {
return main;
}
public void setMain(Main main) {
this.main = main;
}
}
天气的主要课程:
public class Main {
@SerializedName("temp")
@Expose
private Double temp;
@SerializedName("feels_like")
@Expose
private Double feelsLike;
@SerializedName("temp_min")
@Expose
private Double tempMin;
@SerializedName("temp_max")
@Expose
private Double tempMax;
@SerializedName("pressure")
@Expose
private Integer pressure;
@SerializedName("humidity")
@Expose
private Integer humidity;
public Double getTemp() {
return temp;
}
public void setTemp(Double temp) {
this.temp = temp;
}
public Double getFeelsLike() {
return feelsLike;
}
public void setFeelsLike(Double feelsLike) {
this.feelsLike = feelsLike;
}
public Double getTempMin() {
return tempMin;
}
public void setTempMin(Double tempMin) {
this.tempMin = tempMin;
}
public Double getTempMax() {
return tempMax;
}
public void setTempMax(Double tempMax) {
this.tempMax = tempMax;
}
public Integer getPressure() {
return pressure;
}
public void setPressure(Integer pressure) {
this.pressure = pressure;
}
public Integer getHumidity() {
return humidity;
}
public void setHumidity(Integer humidity) {
this.humidity = humidity;
}
}
解决方案
你使用了错误的onSaveInstanceState
方法。覆盖onSaveInstanceState(Bundle outState)
而不是onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState)
.
推荐阅读
- sql-server - SQL Server全文搜索:词的解析形式不同的结果
- c# - Enterprise Architect的元素注释中未显示新行
- react-native - React Native:无法使用地理定位 API 访问位置
- python - Pandas:如何按索引值添加行值
- php - Doctrine ORM:按 2 个类别过滤文章
- angular - angular 2+中的通用组件+通用服务
- xml - 如何验证嵌套元素中的唯一属性?
- java - Tomcat 9 在 Ubuntu 上无法与 Java 10 一起使用
- azure - 没有 ADAL 的 Azure 中的服务到服务身份验证
- awk - awk to store field length in variable then use in print