2016-06-16 1 views
1

в моем приложении у меня есть база данных, где я храню изображения, но когда я пытаюсь получить изображение в битмап, logcat показывает OutOfMemoryError. Эта ошибка не появляется, когда я извлекаю только одно изображение из базы данных (когда я не использую do while цикл мой код работает хорошо) .please помочь, я новичок в android.OutOfMemoryError: Не удалось выделить распределение байтов 82956 с 30836 бесплатными байтами и 30 КБ до OOM?

этот класс попытаться получить изображения из БД:

class Abc { 

    ArrayList <ForBitMap> pic; 

    Abc() { 

     pic = new Abc < >(); 

     DataBaseClass objOfDataBaseClass = new DataBaseClass(context); 
     mCursor = objOfDataBaseClass.showData(); 

     if (mCursor.moveToNext()) { 

      do { 

       byte[] mg = null; 

       mg = mCursor.getBlob(mCursor.getColumnIndex("image")); 
       Bitmap bitmap = BitmapFactory.decodeByteArray(mg, 0, mg.length); 

       pic.add(new ForBitMap(bitmap)); 

      } while (mCursor.moveToFirst()); 

     } 
    } 

это использование класса для хранения значения в ArrayList (ArrayList ПОС;) Статус

class ForBitMap{ 
    Bitmap btmp; 

    ForBitMap(Bitmap btmp){ 
     this.btmp=btmp; 
    } 

} 

logat является:

java.lang.OutOfMemoryError: Failed to allocate a 82956 byte allocation with 30836 free bytes and 30KB until OOM 
+0

попробовать с помощью largeHeap. https://developer.android.com/reference/android/R.styleable.html#AndroidManifestApplication_largeHeap –

+0

@SagarNayak, когда я использую bigheep = true logcat показывает ту же ошибку –

+0

какая ошибка у вас возникла? –

ответ

0

Возможно, вы не должны хранить битмапы в базе данных. Просто сохраните их в хранилище файлов и сохраните путь к файлу в базе данных.

+0

у вас, пожалуйста, дайте мне правильную ссылку на эту тему –

+0

Несомненно, вот пример https://afterthoughtsoftware.com/posts/Storing-image-URIs-using-Android-SQLite –

+0

А также вы должны использовать WeakReferences при извлечении и использовать растровые изображения. Это предотвратит утечку памяти (очень часто вызываемую битмапами) –

0

Попробуйте использовать LruCache для сохранения изображений, растровое изображение выделяет память, каждый битмап загружается evem, если он был загружен ранее. Используя LruCache, он сохранит ваше изображение с помощью ключа в самой кэш-памяти.

См ссылке: https://developer.android.com/reference/android/util/LruCache.html

Смежные вопросы

 Смежные вопросы