2012-12-26 81 views
0

我正在研究壁紙應用程序。我將所有圖像存儲在Drawable文件夾中。使用可繪製位圖的內存不足錯誤

當我添加超過30張壁紙時,我得到了OutOfMemoryError。我想知道如何克服這一點。

我是否應該將所有圖像保存在SQLite Database中,然後從那裏加載或者我需要做其他事情。

我試圖通過Decode Bitmap Factory調整位圖大小,但它並沒有達到我的目的,因爲圖像質量下降。

+1

你試圖實現懶加載概念? –

+0

我是新來的機器人,所以我不知道懶編碼..... –

回答

1

在解碼時調整圖像大小隻會使您的OutOfMemoryError及時提前。該錯誤意味着您的應用程序泄漏了內存,或者嘗試使用比可用內存更多的內存。在Android上使用位圖時,這種情況經常發生,因爲限制大約設置爲25MB,並且高分辨率屏幕越來越普遍。

你必須重新設計你的應用程序。沒有必要在內存中保留30張圖像,因爲它們不能放在一個屏幕上 - 如果它們是縮略圖大小,則在解碼時將它們全部調整大小,並且內存中的像素總數與一個大的圖片,所以你不會用完內存。

你必須找到recycle()位圖的方式,當它們不可見時。如果您更好地描述您的應用程序,我們可以幫助您找到合適的時機,也可以預加載圖像以獲得響應式應用程序和更好的用戶體驗。

+0

其實在我的應用程序中,我在主頁上顯示壁紙的類別,然後如果用戶點擊某個特定的類別,那麼該類別中的所有壁紙顯示在滾動視圖中,並且用戶選擇特定壁紙作爲他的壁紙。 –

+0

你什麼時候遇到錯誤? – Raffaele

+0

當我在Emulator上運行我的應用程序時,它崩潰,並在Logcat中顯示OutOfMemory異常。當我減少圖像的數量比完美運行,我沒有得到任何錯誤。 –

0

我認爲你需要做的是在屏幕上顯示Thumbnails而不是可繪製的圖像。您可以生成Thumbnails並根據您的尺寸要求進行顯示。並且每當用戶點擊Thumb時,只需取原路徑並設置壁紙即可。

另一種選擇是您可以使用Universal Image Loader,它可以幫助您緩存光盤中的圖像(如SD card或您的應用程序的Internal memory)。所以問題Out of Memory可以解決。

+0

我會嘗試你提到的程序,然後讓你知道。 –

-1

如果你想控制你的應用程序崩潰,然後再編寫代碼異常塊:

try { 

    ... 

    } 
    catch(OutOfMemoryError error) { 
     //decide what to do when there is not more memory available 
    } 

還請了此鏈接:

link

+0

我試圖避免使用OutOfMemory,因爲當它到來時我什麼也做不了。 –