У меня возникла интересная проблема, и я не знаю, как ее исправить. Рассмотрим следующий код:Как получить текущий savedInstanceState в обратном вызове AsyncTask?
public class MainActivity extends AppCompatActivity {
private Bundle savedState;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
savedState = savedInstanceState;
Log.d("ON CREATE", "savedState is null: "+(savedState==null));
new CustomTask().execute();
}
public class CustomTask extends AsyncTask<Void, Void, Void> {
protected Void doInBackground(Void... voids) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
protected void onPostExecute(Void v) {
Log.d("POST EXECUTE", "savedState is null: "+(savedState==null));
}
}
}
Этот код сохраняет ссылку на savedInstanceState
затем запускает AsyncTask, который пытается получить доступ к этой переменной через 5 секунд. Если пользователь изменяет ориентацию устройства до того, как AsyncTask заканчивает свою работу, следующий вывод производится:
ON CREATE: savedState is null: true //initial run
ON CREATE: savedState is null: false //re-created after orientation change
POST EXECUTE: savedState is null: true //first instance
POST EXECUTE: savedState is null: false //second instance
Оба пожара onPostExecute()
методов после изменения ориентации, но они, казалось бы, доступ к тому же savedState
переменному, который, как я ожидал, будет не нулевым в обоих случаях, поскольку к нему обращались после изменения ориентации.
По-видимому, первая AsyncTask, которая была запущена до изменения ориентации, все еще ссылается на переменную savedState
до изменения. Итак, мои вопросы:
Зачем это происходит? После восстановления состояния приложения я бы ожидал, что AsyncTask будет просто получать доступ ко всем членам класса в их текущих состояниях, что означает, что savedState
будет не нулевым.
И как я могу получить доступ к текущей переменной savedInstanceState
из обратного вызова AsyncTask, который был запущен до того, как эта переменная была изменена?
Ну больший контекст этой проблемы заключается в том, что у меня есть библиотека запрос веб-сервиса я построил некоторое время назад, чтобы сделать некоторые мыльные запросы и проанализировать результаты. Я просто пытаюсь выполнить некоторые транзакции фрагментов, когда обратный вызов запроса приходит, поэтому я хотел получить доступ к набору 'savedInstanceState' для доступа к фрагменту, который я там установил. Но я думаю, что ваше постоянное предложение по хранению может быть лучшим вариантом. Возможно, я попробую бросить его в разделяемые префы и получить доступ к нему оттуда. – NoChinDeluxe