2013-07-28 8 views
5

私のアプリでは、長期的なバックグラウンドプロセス中にモーダルであるダイアログを表示しています。
このダイアログは、アンドロイドがバックグラウンドタスクから戻ると閉じられます。ダイアログが安全に消されるかどうかを確認します。

final ProgressDialog progressDialog = ProgressDialog.show(activity, "", "Doing something long running", true, true); 

new Thread(new Runnable() { 
    public void run() { 
     someLongRunningCode(); // (not using AsyncTask!) 

     activity.runOnUiThread(new Runnable() { 
      public void run() { 
       progressDialog.dismiss(); 
      } 
     }); 
    } 
}).start(); 

しかし、現在では、バックグラウンド・プロセスがまだ活性が再作成されるので、progressdialogアクティビティから取り外されます実行中にユーザがデバイスを回転させるとき。
長時間実行されているプロセスが完了すると、アンドロイドは明らかに(今取り外された)進行状況ダイアログを非表示にして、その結果例外:java.lang.IllegalArgumentException: View not attached to window managerを表示しようとします。
ダイアログを閉じても安全かどうかを確認する方法はありますか?

編集:既存のダイアログを新しく作成したアクティビティにアタッチする方法はありますか?
新しいクローンのダイアログもうまくいくはずです。

答えて

3

例外をキャッチして無視してください。回転でアクティビティを再開するというAndroidの決定は、スレッドにはそれほど奇妙な例外があります。しかし、最終結果はダイアログボックスが表示されないことです。例外をキャッチするだけでは、ダイアログボックスは表示されません。だからあなたはいいよ。

ランドスケープとポートレートに別のレイアウトやドローイングを使用していない場合は、マニフェストのconfigChangeをアクティビティに対してオーバーライドするだけで、アクティビティを破棄することができます(すべてが正しく回転し、 )。そうすれば、同じダイアログが表示され、例外を受け取るべきではありません。もう1つのオプションは、onSaveInstanceStateとonRestoreInstanceStateについて多くの作業を必要とするため、スレッドがその時間内に実際に終了した場合、タイミングの問題に非常に注意する必要があります。回転アイデアの全体的な再現活動は、マルチスレッドではうまく機能しません。

+0

実際には、タスクがまだ実行中であるため、新しく作成されたアクティビティに既存のダイアログを添付する方法があれば、私にとって最善の解決策になります。それを行う方法はありますか?また、それを反映するために私の質問を更新しました。 – PureSpider

+1

ランドスケープとポートレートに別のレイアウトやドローイングを使用していない場合は、マニフェストのconfigChangeをアクティビティに対してオーバーライドするだけで、アクティビティを破棄することができます(すべてが正しく回転してサイズ変更されます)。もう1つのオプションは、onSaveInstanceStateとonRestoreInstanceStateについて多くの作業を必要とするため、スレッドがその時間内に実際に終了した場合、タイミングの問題に非常に注意する必要があります。 –

+0

その方法はGoogleによって落胆...なぜですか? – PureSpider

0
if (progressDialog != null) { 
    progressDialog.dismiss(); 
} 
+0

もちろん、progressDialogはウィンドウから切り離されてもnullではありません。そうでなければ、NPEを手に入れようとしています。 – PureSpider

+4

はい、あなたは正しいです。私の失敗 –

関連する問題