3

此問題僅在兩個較舊的三星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()加載完成時,它因此也包含不正確的實例。

爲什麼會發生這種情況,以及如何防止活動被(不必要地)重新創建?

+0

此行爲不會看起來很奇怪的表面上,和我的猜測是系統內存壓力。嘗試在'onLowMemory()'回調中添加日誌以查看是否提供了其他信息。另外,也許活動代碼,所以我們可以看到是否有什麼是不必要的堆膨脹? – Devunwired

+0

由於位圖的解碼,堆確實正在充氣。值得注意的是,日誌中的GC語句只發生在重新創建活動之後(這些只會在上面的日誌中的onBitmapLoaded之前出現)。 –

+0

我認爲這個問題與資源管理有關,並且與[文檔中描述的重新創建活動的行爲]有關(http://developer.android.com/training/basics/activity-lifecycle/recreating.html )。看起來,該活動恢復的時間足夠長,因此它可以調用'onSaveInstanceState()',並隨後銷燬以進行重新創建。這個特定問題的解決方案可能是將來自'onActivityResult()'的響應存儲到實例狀態中,並從'onRestoreInstanceState()'執行相同的邏輯。 –

回答

2

顯然configuration of application changes!在onDestroy中添加日誌並提高onCreate的日誌以顯示Bundle的值savedInstanceState。如果savedInstanceState不爲null,則配置更改會強制執行A​​ctivity的重新創建。 在onSaveInstanceState(Bundle)中添加日誌可能有所幫助。

您可以通過在清單中設置活動屬性android:configChanges來處理配置更改。

+0

好的理論,但它似乎並不是這樣,因爲'onConfigurationChanged()'永遠不會被調用。 –

+1

,因爲只有在清單中的android:configChanges設置了一些值時纔會調用它!如果未設置,則默認行爲是重新創建Activity並且不調用onConfigurationChanged。就像我通過在onCreate中檢查savedInstanceState的值來編寫改進日誌添加日誌onSaveInstanceState! –

+0

確實,看起來你是對的!當退出攝像機時,儘管未被清單許可,但該活動採用了橫向方向。 –

相關問題