2011-10-11 80 views
7

我的應用程序有很多圖像,有時由於內存不足而崩潰。 我寫了這個函數,我在開發者網站上找到了。
如何檢測Android中的低內存?

public void onLowMemory(){ 

} 

但問題是,這個功能永遠不會在那些低內存的情況下調用。 我應該怎麼做才能調用這個函數。 當設備上的內存不足時,我需要提醒用戶。

+0

「我的應用程序有很多圖像,有時由於內存不足而崩潰。」 - 什麼意思?由於大量圖像內存不足或者您想知道存儲設備的內存?兩者都有不同的場景。 :-) – user370305

回答

0

我的應用程序有大量的圖片,有時死機,由於低 內存

那部分是不明確的,如果你的應用程序從互聯網或最終用戶下載任何影像擷取來自圖片庫圖片並添加它?在這種情況下

  • 你可以警告,爲了添加新的圖像,他們必須把 回用戶的一些已經挑選圖片
  • 或者更好的,你可以從內存中使用任何算法自己刪除圖像(怎麼樣最近最少使用/查看?)

    另一種情況是你的應用程序本身使用太多的內存,因爲不需要的引用和泄漏..這種情況下,你從來沒有警告用戶,沒有更多的內存..這只是你的責任有效使用內存......這種情況通常主要發生在

  • 您正在泄漏的視圖/佈局,使用許多圖像,在這種情況下, 你必須找出泄漏和解決it..If您使用 日食瞭解MAT
  • 很少的圖像時,過大在size..This是設計師 error..You能獲得良好的外觀和在幾個 千字節大小的圖像感覺...

在任何情況下,這是不明智的,以提醒用戶低內存..程序員應該總是編程思考你可以通過使用更少的內存使應用程序更好..

This線程就會知道你的內存佔用inforamation非常有用的..

而且關於MAT工具使用...

+0

我從圖庫中加載圖像。 – James

-1

下面是我如何使用onLowMemory一個例子,在所有MyApplication 實施爲了清理乾淨,我會刷新內存緩存(主要用於圖片)和谷歌跟蹤器;

@Override 
    public void onLowMemory() { 
     super.onLowMemory(); 
     Log.w(TAG, "onLowMemory() -> clearImageCacheFu!!!"); 
     clearImageCacheFu(); 

     dispatchGoogleTracker(); 
     stopGoogleTracker(); 
    } 

這可能會給你一個想法,以適應你的需要。 希望這有助於。

+0

但是對於我來說這個函數永遠不會被調用。我沒有使用@Override表示法。這是原因。 – James

8

onLowMemory()是不是一個很大的幫助,因爲它得到僅在整個系統運行內存,並在情況下,應用程序正在運行了它的可用堆的次叫空間。

所以我的回答是,你不應該依賴onLowMemory()被調用。恕我直言,你的問題沒有回調方法。

您只需定期輪詢可用堆空間並檢查是否內存不足。

Runtime.getRuntime().maxMemory(); 
Runtime.getRuntime().totalMemory(); 
Runtime.getRuntime().freeMemory(); 
2

隨着onLowMemory()onTrimMemory(),該監控系統內存,這裏的監視應用程序內存的方式。它使用Zsolt Safrany的核心答案。

private final float CHECK_MEMORY_FREQ_SECONDS = 3.0f; 
private final float LOW_MEMORY_THRESHOLD_PERCENT = 5.0f; // Available % 
private Handler memoryHandler_; 

public void onCreate(Bundle savedInstanceState) { 

// Do Stuff... 

// Start Monitoring App Memory Availablity 
    memoryHandler_ = new Handler(); 
    checkAppMemory(); 
} 

public void checkAppMemory(){ 
    // Get app memory info 
    long available = Runtime.getRuntime().maxMemory(); 
    long used = Runtime.getRuntime().totalMemory(); 

    // Check for & and handle low memory state 
    float percentAvailable = 100f * (1f - ((float) used/available)); 
    if(percentAvailable <= LOW_MEMORY_THRESHOLD_PERCENT) 
     handleLowMemory(); 

    // Repeat after a delay 
    memoryHandler_.postDelayed(new Runnable(){ public void run() { 
     checkAppMemory(); 
    }}, (int)(CHECK_MEMORY_FREQ_SECONDS * 1000)); 
} 

public void handleLowMemory(){ 
    // Free Memory Here 
}