2011-01-05 2 views
2

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

01-05 12:28:45.194: ERROR/WindowManager(409): android.view.WindowLeaked: Activity com.MyActivity has leaked window [email protected] 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) 

ответ

3

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

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

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

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

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

Here is a sample project демонстрация этого потока.

+0

Благодарим вас за подробный ответ. Я реализовал пример, который вы дали, но теперь я получаю эту ошибку, когда пытаюсь выполнить мой AsynchTask из моего метода onRestore: вызвано: java.lang.IllegalStateException: не удается выполнить задачу: задача уже выполнена (задача может быть выполнена только один раз) .... at android.os.AsyncTask.execute (AsyncTask.java:383) – ab11

+0

@ ab11: Вы не можете повторно выполнять задачи. Если вы выполнили задачу в старой активности, вам не нужно повторно ее запускать в новом действии. – CommonsWare

+0

Моя задача выполняется, чтобы обработать некоторые вещи в (в настоящее время) несериализуемый объект, который затем используется для создания пользовательского интерфейса. Таким образом, при повороте этот объект теряется (потому что я не могу его сериализовать в сохраненный пакет), поэтому я хочу повторно выполнить мой AsynchTask, чтобы восстановить его. Я могу просто создать новый экземпляр моей AsynchTask (в отличие от использования переменной-члена, как в вашем примере). Но даже если я сделаю это и передам его this.MyActivity в качестве параметра конструкции, я все равно получаю исключение оригинального «окна утечки». – ab11