3

此问题仅在两款较旧的三星 Galaxy 机型上出现,但重现性非常好。

我有一个简单的应用程序,它显示通过设备的相机应用程序拍摄的照片。它有一个按钮来启动该应用程序,并在 AsyncTask 中处理结果以将其下采样到 ImageView 中。

从相机应用程序返回时,活动的流程出现问题:由于某种原因,活动被创建,处理导致 AsyncTask 中的 AsyncTaskonActivityResult()被销毁,只是立即重新创建。一旦 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 中改进日志以显示 Bundle savedInstanceState的值。如果 savedInstanceState 不为空,则配置更改强制重新创建 Activity。在onSaveInstanceState(Bundle)中添加日志可能会有所帮助。

您可以通过在清单中设置 Activity 属性android:configChanges来处理自己的配置更改。

于 2012-06-01T14:40:04.590 回答
0

关于这个问题的小文章,希望对您有所帮助: The problem with an external camera in Android using MediaStore.ACTION_IMAGE_CAPTURE

于 2013-03-30T19:59:38.667 回答