test - memory usage android




Android:內存不足時靜態變量null (5)

  1. 你不能。 Android需要不時釋放內存。 想像一下,如果所有應用程序都有大量靜態數據應該永久駐留 - 你會如何在內存中使用它? 這是一部手機。 它沒有虛擬內存。

  2. (和3):任何旨在持久的東西都需要通過SharedPreferences,Sqlite數據庫或文件進行存儲。

我有一個應用程序,它有一些靜態變量。 這些變量存儲在名為DataContext的獨立類中。 這些變量在應用程序啟動時從原始文件初始化(在MyApplication的onCreate()中調用名為DataContext.initConstant()的方法,該方法擴展了Application)。

(編輯:initConstant方法使用AsyncTask從文件加載此數據)。

當我的應用程序在後台運行一段時間或者我的應用程序用於大量內存時,這些靜態變量將變為null。

  1. 如何預防?

  2. 如果不是我應該怎麼做我的靜態變量?

    我有其他數據存儲在靜態變量中以用於不同的活動,但我清除它們或在MyApplication的onLowMemory()它們傳遞給null。

  3. 如果這些數據太大而無法在Intent中序列化,數據庫無法使用(無論出於何種原因),並且無法通過序列化存儲在文件中,那麼在活動之間保持一些數據可訪問的最佳方法是什麼?


onResume()方法中,您可以查詢靜態數據以查看它是否存在,如果不存在,則再次將其重新加載。


您可以使用共享首選項來存儲值,而不是使用靜態變量。

注意:對於共享首選項,您也不應該給重負載。

我已經通過使用getter和setter函數的超類來存儲和檢索共享首選項變量來解決這個問題。

我的應用程序中的所有類都擴展了超類而不是活動。


我在我的靜態範圍中存儲了User對象和Client對象。 我不時注意到引用變為null。 所以現在在我的getters中我檢查這個值是否為null,如果是,我重新啟動應用程序。

Intent i = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName());
                i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                context.startActivity(i);

我本可以選擇重新加載客戶端,因為我將訪問令牌存儲在prefs中但是我做了很多初始化,我決定重新啟動應用程序是最好的主意。


最有可能的問題是您的應用程序在後台被殺死,然後在您返回時重新創建。 查看活動生命週期文檔,了解單個活動何時可能發生這種情況。 您需要確保在正確的時間點將存儲在內存中的任何內容移動到更長久的存儲,以避免在應用程序被殺死時丟失該信息。

我不確定你究竟存儲了什麼,但聽起來好像使用共享首選項可能效果很好。 數據存儲的這個頁面解釋了許多不同的永久存儲數據的方法,包括共享首選項。





low-memory