2013-08-18 54 views
0

我正在創建一個Android應用程序,直到現在我還沒有用完內存。令人困惑的部分是我不希望內存耗盡。來自XML的Android致命信號11

我簡單地將一個新的線性佈局添加到佈局xml文件。它有一個40kb大的圖像背景。其他加載的圖像大約爲12kb,背景在120kb處大得多。當這個圖像被加載時,我會在運行時收到一個致命的信號11。如果我從佈局中刪除背景,它會正常工作。然後,我改變了圖像要小得多,它是(2000x600)之前,所以現在它是14kb。現在它工作正常。很顯然,額外的26kb導致了一個問題...

我應該採取什麼樣的預防措施,以確保不會再發生。很明顯,我想要高質量的圖像,而2000x600可能會過分,因爲它是一款手機應用程序,但我應遵循哪些指南?

是否有內存使用上限可以擴展或我應該留下來?另外,如果我在scrollview上加載了許多圖像,這會導致應用程序崩潰?我曾經加載過很多圖片,但之前從未有過崩潰的圖片,我只是對由於內存使用量很少而導致的錯誤感到困惑。 (在今天的術語至少)

問候,

傑克,因爲它們在磁盤上做

回答

0

圖像不消耗在RAM的存儲器中的相同的量。您可以通過獲得內存使用:

width*height*4 (for images with an alpha channel) 

width*height*3 (for images without an alpha channel) 

Android應用被分配的堆空間在RAM一定量,這將永遠是一個特別的設備和ROM上相同該設備上的版本。最低爲16 MB,儘管現在大多數設備給你一個更舒適的32 MB或64 MB。這真的取決於設備。

當您的應用超過此堆空間時,您將獲得Out of Memory Exceptions(OOM)。簡單的解決方法是:不要超過這個堆空間。

在您的應用中獲得高質量圖像的最佳方式是使用密度桶並提供Android可供選擇的不同尺寸。 LDPI屏幕無法使用高分辨率圖像,因此您只應在LDPI中提供較低的分辨率。另一方面,HDPI設備可以使用更好的分辨率,並且如果您提供一個Android可以使用它。設備的分辨率越高,給您的應用程序運行分配的堆空間就越多。

管理內存的另一種方法是僅通過實現延遲加載來加載所需的內容。這對列表視圖和滾動視圖以及其他基於適配器的視圖系統特別有用。

在Android 3.0及以上版本中,您可以使用android:largeHeap="true"來請求更大的堆。但是,應該避免這種情況,因爲每當您的應用程序啓動時,用戶都會注意到其他應用程序將從內存中移除,並且無法保證您在任何情況下都會收到更大的堆。

+0

我正在通過runtime.getRuntime()。getFreeMemory等運行的應用程序獲取我的使用率百分比...大約爲75%。我發現,當我清除緩存或刪除應用程序的背景圖像時,它實際上會佔用更多的內存,即使它的數量很少,如4kb左右。應該佔用多少內存? –

相關問題