2

私は次のような状況にあります

  1. から長時間実行されるユーザースレッド(Thread)を生成しますActivity
  2. ソフトバックボタンを押します。だから、Activity破壊されました。
  3. もう一度同じように起動Activityします。Thread以前に起動されたものはまだ実行されていることに注意してください。

前のものがまだ実行されている間にActivity別の同じものを起動するのを防ぐために、これが私がしていることですThreadThread

  • を起動した後Thread、静的変数に格納します。したがって、次に同じスレッドを起動しようとするときに、静的変数を介して前のスレッドの活性をチェックします。これは良い習慣ですか?これを克服するためのベストプラクティスは何ですか?

ユーザースレッドは、Activityそれを起動したものへの参照を保持していることに注意してください。ただし、Activityユーザーがソフト戻るボタンを押すと、が破壊される可能性があります。したがって、新しいアクティビティを再度起動すると、threadはそのことに気づかず、まだ古いものを参照していActivityます。したがって、ユーザースレッドが古いメンバーにアクセスしようとすると、既に破棄さActivityれているためにクラッシュが発生します。これを克服するためのベストプラクティスは何ですか?Activity

4

1 に答える 1

1

これを克服する最善の方法は、AsyncTask代わりに an を使用することです。Activityタスクの実行中に が破棄された場合、AsyncTask(および操作を実行しているその基になる) は、が完了Threadするまで実行を続けます。が呼び出されるまでに が終了しているdoInBackground()場合、このブログ投稿に記載されている理由により、 s に遭遇することはありません。ActivitynullonPostExecuteNullPointerException

ユーザーが を「バックアウト」した場合にすぐにタスクをキャンセルしたい場合は、のメソッドでActivityを呼び出すことができmTask.cancel()ます。AsyncTaskActivityonDestroy

ユーザーが を「バックアウト」した場合にタスクをすぐにキャンセルしたくない場合Activity、長期的な操作はActivityインスタンスに固有のものとは思えません。この状況では、多くの場合、Service代わりに a を使用することをお勧めします。

于 2012-07-08T03:19:42.730 に答える