2013-10-31 33 views
1

什麼時候該視圖的「死亡」,並在Android中不存在?何時在android中查看'殺死'?

例如,假設我有一個asynctask,並且我在doInBackground()方法中運行了一些網絡相關的東西。然後,我需要在onPostExecute()方法中更新我的UI視圖。 假設我的doInBackground()需要一段時間,當它正在處理中時,用戶移回或甚至按下主頁按鈕。該任務將繼續,因爲doInBackground在單獨的線程上運行,但是,一旦完成並調用onPostExecute更新視圖,視圖可能不在那裏。

  1. 即使活動不可見(無論是主屏幕還是其他活動),當視圖嘗試訪問和修改時會發生什麼?他們在'堆/內存/任何'中停留多久,在onDestroy之後是否收集垃圾?或者他們在那之後呆在附近?

我知道一個辦法不進入這個hastle是使用被打開和關閉內部的onResume和的onStop開關和onPostExecute更新視圖之前檢查一下吧,但我不能確定這是否是固體的方法在android應用中應用?如果不是,建議的方式是什麼?

回答

1

A view活動內部可以被認爲是活動類中的任何其他object。只要它被其他一些object引用,它將一直保留在內存中。此對象可能是另一個viewactivity。這意味着視圖將在以下情況下消失:

1)activityparent view從視圖樹中刪除removeView(),因此沒有人保留對其的引用。

2)包含該視圖的activityparent view被銷燬/從內存中消失。

如果活動是不可見的(無論是去主屏幕,或其他 活動),當意見設法把訪問和體改 會發生什麼?他們在'堆/記憶/任何'中停留多久,他們在onDestroy之後獲得垃圾回收嗎? ?或者他們在那之後呆在附近?

只要您的活動可用,您就可以訪問該視圖。並且您可以通過閱讀Activity Lifecycle

當您嘗試訪問已從內存中刪除的視圖時,您將收到NullPointerException。簡單&固體方式,您可以如何處理onPostExecute是更新前檢查空,例如:

// inside onPostExecute 
if(textView != null) { 
    textView.setText("Background Method Finished"); 
} 

這種方法的優點是:

1)您沒有明確跟蹤顯示/隱藏

2)有時,查看不在屏幕上並不意味着它從內存中消失。例如,假設您的AsyncTask完成,而您的活動是paused/stopped而不是destroyed。在這種情況下,您仍然可以更新視圖,以便在活動爲resumed時更新可見並且不會丟失。

+0

感謝您的詳細解答! – tony9099

-2

你有很多方法

1.You可以取消的AsyncTask

2.You可以殺死進程,所以會有沒有在menory或堆。

+0

這不是我的問題。 – tony9099

+1

視圖與一個活動相關聯,如果你殺了一個活動,視圖也會被殺死 – Meenal

+0

-1暗示殺死該過程 - 這是完全沒有要求的。 –

0

當用戶離開該活動時取消異步任務。取消任務後,onPostExecute將不會在異步任務類中的onCanceled事件中調用並捕獲取消事件。

+0

@bump你是什麼意思? – tony9099