У меня есть приложение, у которого пользовательский интерфейс выполняет небольшую работу по созданию (должен обрабатывать некоторые вещи). Итак, я создаю пользовательский интерфейс с помощью 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)
Благодарим вас за подробный ответ. Я реализовал пример, который вы дали, но теперь я получаю эту ошибку, когда пытаюсь выполнить мой AsynchTask из моего метода onRestore: вызвано: java.lang.IllegalStateException: не удается выполнить задачу: задача уже выполнена (задача может быть выполнена только один раз) .... at android.os.AsyncTask.execute (AsyncTask.java:383) – ab11
@ ab11: Вы не можете повторно выполнять задачи. Если вы выполнили задачу в старой активности, вам не нужно повторно ее запускать в новом действии. – CommonsWare
Моя задача выполняется, чтобы обработать некоторые вещи в (в настоящее время) несериализуемый объект, который затем используется для создания пользовательского интерфейса. Таким образом, при повороте этот объект теряется (потому что я не могу его сериализовать в сохраненный пакет), поэтому я хочу повторно выполнить мой AsynchTask, чтобы восстановить его. Я могу просто создать новый экземпляр моей AsynchTask (в отличие от использования переменной-члена, как в вашем примере). Но даже если я сделаю это и передам его this.MyActivity в качестве параметра конструкции, я все равно получаю исключение оригинального «окна утечки». – ab11