此問題僅在兩個較舊的三星Galaxy型號上發生,但仍具有很高的可重現性。從相機應用程序返回時重新創建活動
我有一個簡單的應用程序,顯示通過設備的相機應用程序拍攝的照片。它有一個按鈕來啓動該應用程序,並在AsyncTask中處理結果以將其縮減爲ImageView。
問題出在從相機應用程序返回時的活動流程:出於某種原因,活動已創建,進程導致onActivityResult()
中的AsyncTask被銷燬,只能立即重新創建。一旦AsyncTask完成,它就會引用不正確的/舊的活動。
放置一些調試語句到不同的生命週期回調顯示了這一奇怪的行爲:
06-02 16:01:53.509: I/myapp(4437): onCreate [email protected]
06-02 16:01:53.509: I/myapp(4437): onResume [email protected]
06-02 16:01:58.298: I/myapp(4437): onPause [email protected]
06-02 16:01:59.470: I/myapp(4437): onStop [email protected]
[a photo is taken in the camera app]
06-02 16:02:10.196: I/myapp(4437): onCreate [email protected]
06-02 16:02:10.251: I/myapp(4437): onActivityResult [email protected]
06-02 16:02:10.259: I/myapp(4437): onResume [email protected]
06-02 16:02:10.712: I/myapp(4437): onPause [email protected]
06-02 16:02:10.720: I/myapp(4437): onStop [email protected]
06-02 16:02:10.923: I/myapp(4437): onCreate [email protected]
06-02 16:02:10.931: I/myapp(4437): onResume [email protected]
06-02 16:02:12.564: I/myapp(4437): onBitmapLoaded [email protected]
上onActivityResult()
被稱爲(注意上面的散列碼)活動的一個實例不再匹配的最後實例,它是正在顯示。當我的位圖通過onBitmapLoaded()
加載完成時,它因此也包含不正確的實例。
爲什麼會發生這種情況,以及如何防止活動被(不必要地)重新創建?
此行爲不會看起來很奇怪的表面上,和我的猜測是系統內存壓力。嘗試在'onLowMemory()'回調中添加日誌以查看是否提供了其他信息。另外,也許活動代碼,所以我們可以看到是否有什麼是不必要的堆膨脹? – Devunwired
由於位圖的解碼,堆確實正在充氣。值得注意的是,日誌中的GC語句只發生在重新創建活動之後(這些只會在上面的日誌中的onBitmapLoaded之前出現)。 –
我認爲這個問題與資源管理有關,並且與[文檔中描述的重新創建活動的行爲]有關(http://developer.android.com/training/basics/activity-lifecycle/recreating.html )。看起來,該活動恢復的時間足夠長,因此它可以調用'onSaveInstanceState()',並隨後銷燬以進行重新創建。這個特定問題的解決方案可能是將來自'onActivityResult()'的響應存儲到實例狀態中,並從'onRestoreInstanceState()'執行相同的邏輯。 –