Android: сбой AsynchTask при вызове из onRestoreInstanceState () - PullRequest
2 голосов
/ 05 января 2011

У меня есть приложение, пользовательский интерфейс которого требует небольшой работы для сборки (должен обрабатывать некоторые вещи).Итак, я создаю пользовательский интерфейс с помощью AsynchTask (он показывает диалог прогресса при выполнении некоторой фоновой обработки, а затем обновляет пользовательский интерфейс).Я хотел бы иметь возможность вызывать этот AsynchTask из OnRestoreInstanceState (), чтобы я мог перестроить пользовательский интерфейс на ротации.Однако когда я вызываю MyAsynchTask.execute () из метода onRestorInstanceState (), я получаю следующее исключение:

01-05 12:28:45.194: ERROR/WindowManager(409): android.view.WindowLeaked: Activity com.MyActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@43e70368 that was originally added here
01-05 12:28:45.194: ERROR/WindowManager(409):     at android.view.ViewRoot.<init>(ViewRoot.java:247)
01-05 12:28:45.194: ERROR/WindowManager(409):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
01-05 12:28:45.194: ERROR/WindowManager(409):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
01-05 12:28:45.194: ERROR/WindowManager(409):     at android.view.Window$LocalWindowManager.addView(Window.java:424)
01-05 12:28:45.194: ERROR/WindowManager(409):     at android.app.Dialog.show(Dialog.java:241)
01-05 12:28:45.194: ERROR/WindowManager(409):     at com.MyClass$MyAsynchTask.onPreExecute(MyClass.java:428)

1 Ответ

3 голосов
/ 05 января 2011

Шаг # 1: Сделайте ваш AsyncTask статическим внутренним классом или обычным полным Java-классом.

Шаг # 2: вручную связать действие, с которым должна работать задача, с помощью параметра конструктора, который содержится в элементе данных задачи.

Шаг # 3: вернуть объект задачи из onRetainNonConfigurationInstance()

Шаг # 4: В onCreate() нового экземпляра действия получите существующий объект задачи с помощью getLastNonConfigurationInstance() и вручную заново свяжите действие, с которым задача должна работать, с помощью метода установки.

Шаг № 4: При необходимости измените onPostExecute(), чтобы он не ссылался на действие.

Вот пример проекта , демонстрирующий этот поток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...