2017-09-05 61 views
-6

我是新來的android編程我在加載位圖時遇到問題我有近92位位圖,我需要加載。但經過9個或10位圖的應用程序崩潰..好心幫我我的應用程序崩潰當我在arraylist中加載大量的位圖

這裏是「無法與1805056個免費字節,1762KB,直到OOM分配22050012字節分配」 09-05 19:49錯誤 投擲的OutOfMemoryError: 36.188 2615年至2615年/ com.example.zeeshanahmedawan.yourworriestheirsolutions d/Skia的:---分配失敗縮放位圖

mPages = new ArrayList<Bitmap>(); 
    mPages.add(BitmapFactory.decodeResource(getResources(), R.drawable.p1)); 
    mPages.add(BitmapFactory.decodeResource(getResources(), R.drawable.p2)); 
    mPages.add(BitmapFactory.decodeResource(getResources(), R.drawable.p3)); 
    mPages.add(BitmapFactory.decodeResource(getResources(), R.drawable.p4)); 
    mPages.add(BitmapFactory.decodeResource(getResources(), R.drawable.p5)); 
    mPages.add(BitmapFactory.decodeResource(getResources(), R.drawable.p6)); 
    mPages.add(BitmapFactory.decodeResource(getResources(), R.drawable.p7)); 
    mPages.add(BitmapFactory.decodeResource(getResources(), R.drawable.p8)); 
    mPages.add(BitmapFactory.decodeResource(getResources(), R.drawable.p9)); 
+0

使用LogCat檢查與您的崩潰相關的Java堆棧跟蹤:https://stackoverflow.com/questions/23353173/uncomfort-myapp-has-stopped-how-can -i-解決 - 這一點。 – CommonsWare

+0

丟失OutOfMemoryError「分配失敗,分配失敗,無法分配22050012字節分配,1805056個空閒字節和1762KB直到OOM」 09-05 19:49:36.188 2615-2615/com.example.zeeshanahmedawan.yourworriestheirsolutions D/skia:---分配失敗縮放的位圖 @CommonsWare –

+1

我會說你錯誤地去了解它。將充氣位圖存儲在數組中會不必要地使用大量內存。爲什麼不只保留一個數組或資源ID列表,而只需要在RecyclerView的適配器中進行充氣? –

回答

2

如果所有圖像的大小都相似,則您正試圖分配〜2028601104字節=〜1981055KB =〜1934MB。您的應用可以使用的大多數Android設備上的64MB或更少。

失敗的圖像大小爲22050012字節,當解碼或縮放時。這相當於2347 x 2347像素。幾乎沒有任何Android設備具有該分辨率的屏幕。

所以,你需要做幾件事情:

  1. 停止嘗試加載所有的位圖的前面。根據需要加載它們。

  2. 降低位圖的分辨率。

  3. 如果您將位圖放在除res/drawable-nodpi/以外的任何目錄中,請將它們移動到res/drawable-nodpi/。例如,如果將它們放在res/drawable/中,即res/drawable-mdpi/的同義詞,則表示圖像是爲mdpi設備(〜160dpi)設計的。 Android會自動縮放這些圖片以獲取更高密度的設備。如果您的圖片很大,則Android無法承擔這種縮放比例。 res/drawable-nodpi/告訴Android,這些圖像沒有與特定的密度相關聯,因此不應該按照這種方式進行縮放。

您可能還想重新考慮這整個計劃。處理大量的位圖—更不用說大型的—即使對於有經驗的Android應用程序開發人員也很複雜。內存管理很難。如果你對Android陌生,也許你應該考慮一個實現起來更簡單的項目。

+0

感謝問題解決。 –

0

您是內存不足。

您的位圖太大而無法存儲在數組中。

+1

在這種情況下,模擬器中的內存量沒有意義。 OP正在嘗試分配〜2GB,並且每進程堆的限制將遠遠小於此。 – CommonsWare

+0

其中有92個。我正在走出一條路,猜測它們都是同樣大小的。 – CommonsWare

0
  1. 如果您只需要查看照片,可以使用RecyclerView。它只在內存中保留現在屏幕上的一些照片,並釋放已經滾出屏幕的照片。

  2. 爲了其他目的,您可以將所有照片保存到SD卡。

對於這兩種情況1 & 2使用特殊庫(Glide,Picasso,...)。庫很容易使用,它們可以自動將下載的圖像緩存在SD卡上,並具有許多其他優點。搜索「glide with recyclerview」(例如)

相關問題