首页 > 解决方案 > 从 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;
}

}

标签: javaandroid

解决方案


你使用了错误的onSaveInstanceState方法。覆盖onSaveInstanceState(Bundle outState)而不是onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState).


推荐阅读