3

この問題は、2つの古いSamsung Galaxyモデルでのみ発生しますが、それでも非常に再現性があります。

デバイスのカメラアプリで撮影した写真を表示するシンプルなアプリがあります。そのアプリを起動するためのボタンが1つあり、結果をAsyncTaskで処理して、ImageViewにダウンサンプリングします。

この問題は、カメラアプリから戻るときのアクティビティのフローから発生します。何らかの理由で、アクティビティが作成され、プロセスの結果がAsyncTaskになりonActivityResult()、破棄されますが、すぐに再作成されます。AsyncTaskが完了すると、誤った/古いアクティビティへの参照が保持されます。

いくつかのデバッグステートメントをさまざまなライフサイクルコールバックに配置すると、この奇妙な動作が明らかになります。

06-02 16:01:53.509: I/myapp(4437): onCreate com.myapp.PhotoActivity_@488cbef8
06-02 16:01:53.509: I/myapp(4437): onResume com.myapp.PhotoActivity_@488cbef8
06-02 16:01:58.298: I/myapp(4437): onPause com.myapp.PhotoActivity_@488cbef8
06-02 16:01:59.470: I/myapp(4437): onStop com.myapp.PhotoActivity_@488cbef8
[a photo is taken in the camera app]
06-02 16:02:10.196: I/myapp(4437): onCreate com.myapp.PhotoActivity_@4874f8b8
06-02 16:02:10.251: I/myapp(4437): onActivityResult com.myapp.PhotoActivity_@4874f8b8
06-02 16:02:10.259: I/myapp(4437): onResume com.myapp.PhotoActivity_@4874f8b8
06-02 16:02:10.712: I/myapp(4437): onPause com.myapp.PhotoActivity_@4874f8b8
06-02 16:02:10.720: I/myapp(4437): onStop com.myapp.PhotoActivity_@4874f8b8
06-02 16:02:10.923: I/myapp(4437): onCreate com.myapp.PhotoActivity_@48817118
06-02 16:02:10.931: I/myapp(4437): onResume com.myapp.PhotoActivity_@48817118
06-02 16:02:12.564: I/myapp(4437): onBitmapLoaded com.myapp.PhotoActivity_@4874f8b8

呼び出されたアクティビティのインスタンスonActivityResult()(上記のハッシュコードに注意)は、表示されている最後のインスタンスと一致しなくなりました。したがって、ビットマップのロードスルーonBitmapLoaded()が完了すると、誤ったインスタンスも保持されます。

なぜこれが発生するのですか?また、アクティビティが(不必要に)再作成されるのを防ぐにはどうすればよいですか?

4

2 に答える 2

3

どうやらアプリケーションの構成が変更されました!onDestroyにログを追加し、onCreateのログインを改善して、BundlesavedInstanceStateの値を表示します。savedInstanceStateがnullでない場合、構成の変更によりアクティビティが強制的に再作成されます。onSaveInstanceState(Bundle)にログを追加すると役立つ場合があります。

マニフェストでActivityプロパティandroid:configChangesを設定することにより、構成の変更を自分で処理できます。

于 2012-06-01T14:40:04.590 に答える