2016-03-07 77 views
1

我有一個自定義的應用程序類與很多實例屬性和活動依賴於此屬性。有時當活動在後臺並且我打開應用程序時,會發生一些空指針異常。我知道這個問題的原因是Android正在殺死該應用程序。當我打開應用程序時,將再次創建當前活動,但現在應用程序屬性爲空。如何處理Android內存管理和onTrimMemory回調?

我有兩個選擇來解決這個問題。當級別爲TRIM_MEMORY_MODERATE或更高時,兩種解決方案均需要使用onTrimMemory方法清除應用程序緩存。

1º - 清除緩存並打開應用程序時,如果所需的應用程序屬性爲空,則當前活動結束。只有主要活動會再次加載應用程序屬性。這需要較少的工作,因爲最重構將發生在主要活動中。

2º - 每次應用程序屬性爲空時,重構所有要從後端加載所有必需數據的活動。在這裏我有很多工作,因爲所有的活動都必須是獨立的,並且必須知道如何加載他自己的數據。

處理此Android行爲的最佳方法是什麼?你如何解決這個問題?當緩存數據從自定義Application類中清除時,我需要做些什麼來防止這個空指針?

回答

0

我不知道很多關於你的數據倉庫架構存在,但應遵循以下規則:

  1. TRIM_MEMORY_BACKGROUND - 嘗試刪除所有的大致所需要的資源,你知道你不會需要重新東西 - 啓動活動
  2. TRIM_MEMORY_MODERATE - 你也可以清除可能是由加載器或一些的AsyncTask
  3. TRIM_MEMORY_COMPLETE容易地裝載一些活動所需的資源 - 你可能會認爲,以清除您的應用類中幾乎一切,只保留最低限度 - 所需的數據爲您的應用程序啓動並正確恢復活動狀態。

除上述那些我3還建議您使用TRIM_MEMORY_UI_HIDDEN這意味着你的活動不再是可見的,你可以釋放出大量的用戶界面相關的資源,尤其是位圖緩存:)你的活動中。

+0

我決定使用TRIM_MEMORY_MODERATE,但我需要更多詳細信息,說明清除緩存時應該如何處理這些活動。 AsyncTask例如應該放在onResume中?現在,我正在完成沒有找到緩存上的屬性時的活動。 –

+0

你不應該那樣做,你不應該手動完成你的活動,只要它是根據你設計/功能流程的想要的行爲。對於大多數情況下應該使用AsyncLoaders來加載所需資源的活動,他們已經爲您處理了緩存,並且在活動被銷燬時它們將被清除。 –

+0

我現在面臨的最大問題是有四個片段(tabLayout)的活動。他們以前已經呈現過。當此活動恢復時,我需要使用實際數據刷新所有視圖。該活動的onResume首先被調用並從後端加載基本數據。片段onResume並行運行,因爲onResume活動異步加載。片段也從後端加載數據。這在recyclerviews和其他組件中造成了一種奇怪的行爲,因爲它必須按照第一次加載的順序運行。 –