首先,我瞭解有關java.lang.OutOfMemoryError
的問題,並且之前已經多次提到Bitmap。我也檢查了Displaying Bitmaps Efficiently頁面。將100多個字符串轉換爲字節數組時,java.lang.OutOfMemoryError
我的使用情況:
我存儲兩個不同尺寸的位圖作爲字符串中的SQLite數據庫。位圖的第一個大小是屏幕寬度的50%,第二個大小是屏幕寬度的100%。
我正在使用一個RecyclerView,它在ImageViews中顯示50%或100%的屏幕寬度的圖像,因此正在加載的的位圖不會比他們需要的大,並且它們在圖像從數據庫中檢索。
我也使用AsyncTask加載位圖。
我在RecyclerView中有超過180個不同的項目,所以我總共創建了超過360個Bitmaps(即numberOfimages * theDifferentSizesOfEachImage)。我從這個代碼coverting的圖像轉換成字節數組的字符串版本:byte [] byteArray = Base64.decode(encodedString, Base64.DEFAULT);
的問題
的活性爲能夠圍繞170個不同的圖像加載比沒有encurring的java.lang.OutOfMemoryError
,除非我重新啓動同活動(例如加載活動,然後通過在導航抽屜中再次單擊並重復該過程來重新創建活動),並在將字符串轉換爲字節數組的同時發生java.lang.OutOfMemoryError
。
我使用滑翔庫使用下面的代碼的字節數組轉換爲位圖:
Bitmap bitmap = Glide.with(context).load(byteArray).asBitmap()
.dontTransform().dontAnimate().skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE).into(-1, -1).get();
我概括地說
問題如何避免發生java.lang.OutOfMemoryError
而我是否將字符串轉換爲字節數組?
注意
利用Glide我打電話循環()在給定的位圖創建位圖,然後將其設置爲null
後。
我也已經在我的Android清單
在此先感謝使用android:largeHeap="true"
編輯
這裏是我正在創建中位圖字符串:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.WEBP,100, baos);
byte [] b =baos.toByteArray();
String bitmapString = Base64.encodeToString(b, Base64.DEFAULT);
爲什麼不在存儲之前壓縮它... –
感謝您的回覆。如果你指的是壓縮位圖,我已經這樣做了,我編輯了我的問題,你可以看到我如何壓縮位圖,然後將它們轉換爲字符串 –
「我將兩個不同大小的位圖存儲爲SQLite數據庫中的字符串」 - - 爲什麼?將它們作爲文件存儲,並將文件名存儲在數據庫中。或者,將它們存儲爲BLOB列,以至少消除「String」轉換。 – CommonsWare