2011-01-05 18 views
2

UIの作成に少し時間がかかる(いくつかのものを処理する必要がある)アプリを持っています。だから、AsynchTaskを使ってUIをビルドします(バックグラウンド処理中に進捗ダイアログが表示され、その後UIが更新されます)。私は、このAsynchTaskをOnRestoreInstanceState()から呼び出せるようにしたいので、私は回転でUIを再構築することができます。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:私はonRestorInstanceState()メソッドからMyAsynchTask.execute()を呼び出すときしかし、私は以下の例外を取得あなたのAsyncTask静的内部クラスや定期的な完全なJavaクラスを作成します。

ステップ2:タスクが動作する必要があるアクティビティを、タスクのデータメンバーに保持されているコンストラクタパラメータを介して手動で関連付けます。

ステップ#3:onRetainNonConfigurationInstance()

ステップ#4からタスクオブジェクトを返します:新しいアクティビティー・インスタンスのonCreate()では、手動でgetLastNonConfigurationInstance()を経由して、既存のタスク・オブジェクトを取得し、タスクを経由して動作するはずの活動が再度関連付けますセッターメソッド。

ステップ4:必要に応じて、アクティビティを参照しないようにonPostExecute()を変更します。

Here is a sample projectこのフローを実証しています。

+0

詳細な対応をありがとうございます。あなたが与えた例を実装しましたが、私のonRestoreメソッドからAsynchTaskを実行しようとするとこのエラーが発生します:原因:java.lang.IllegalStateException:タスクを実行できません:タスクは既に実行されています(タスクは実行可能です....)android.os.AsyncTask.execute(AsyncTask.java:383) – ab11

+0

@ ab11:タスクを再実行することはできません。古いアクティビティでタスクを実行した場合は、新しいアクティビティで再実行する必要はありません。 – CommonsWare

+0

私のタスクは、いくつかのものを(現在)直列化不可能なオブジェクトに処理してUIを作成するために使用されます。したがって、回転すると、このオブジェクトは失われます(私は現在格納されているバンドルにシリアル化できないため)。そのためAsynchTaskを再実行して復元したいのです。 AsynchTaskの新しいインスタンスを作成することができます(あなたの例のようにメンバ変数を使用するのではなく)。しかし、私がこれを行い、this.MyActivityをパラメータとして渡しても、私はまだ元の "ウィンドウが漏れた"例外を取得します。 – ab11

関連する問題