2015-10-18 85 views
0

以下文檔頁面提到android可能會在某些情況下銷燬活動實例,並在稍後使用之前保存的狀態重新創建它。關於android銷燬和重新創建活動的問題

http://developer.android.com/training/basics/activity-lifecycle/recreating.html

我想知道什麼,如果活動被破壞並重新創建以下兩種情況下發生的。

1)該活動有一個匿名AsyncTask運行,它在完成時將一些值設置爲UI元素。如果在AsyncTask仍在運行時活動被破壞,AsyncTask完成後會發生什麼情況?如果在onPostExecute()上訪問某些UI元素,是否會導致異常?如果不是,重新創建活動時,中所做的更改是否可見?

2)如果在View元素中使用View.setTag()將某個對象設置爲標記,則在銷燬並重新創建活動後,設置爲標記的對象是否仍然可以在重新創建的視圖中使用?

+0

第二點:http://stackoverflow.com/questions/16172637/is-a-views-tag-restored-when-the-activity-whose-layout-contains-the-view-is-r – njzk2

回答

1

1)如果您嘗試從舊的Activity對象訪問UI元素,它將引發異常。在內部,創建一個全新的Activity對象以及新的View對象,這意味着舊的引用無效。請記住,如果你持有一個硬引用,你會用你的AsyncTask泄漏內存。

2)同樣的事情發生在這裏。一個新的View對象被創建,舊的View的所有成員變量都會丟失。

只有保存在onSaveInstanceState()方法中的數據纔會結轉。您可以通過在手機的開發人員選項中啓用「不保留活動」,甚至在方向更改時輕鬆測試此情形。您還可以使用調試器驗證是否創建了新的對象引用。

0

當Async Task完成時,AsyncTask將不會更新新Activity的UI。事實上,它會嘗試更新真正意義上不存在的活動的前一個實例。所以這可能會導致某種拋出IllegalArgumentException的異常或IllegalStateException異常

你爲什麼不通過只是創造千迭代循環的異步任務,並按回破壞活動的嘗試,看看結果

1

要添加到其他人的評論,如果你要運行一個的AsyncTask,你應該在你的onPostExecute方法做的第一件事是檢查活動狀態:

if (!isFinishing()) { ... } 

片段具有類似的邏輯

if (isAdded() && !getActivity().isFinishing()) { ... } 

就我個人而言,我更喜歡將RxJava與RxLifecyle擴展一起使用,因爲它使它更加清潔,但這是另一天的故事。