2016-03-27 24 views
0

Her satırda görüntü içeren bir ListView uygulaması olan bir android uygulaması yapmaya çalışıyorum. Ben SQLTip veritabanındaki tüm görüntüleri BLOB veri türü ile saklamak ve daha sonra ListView bu görüntüleri ile doldurmak istiyorum, ama ne zaman ben OutOfMemoryError olsun listede 2 jpeg fazla resim var. İnternette bulunan ve bellek kullanımını azaltan birçok teknik denedim ama yine de bu problemi çözemiyorum. Ben android belgelerinde options.inJustDecodeBounds ve options.inSampleSize kullanımını buldum ama yine de aynı istisna oluyor. Aşağıda Bitmap ile kodumuzu bayt dizisine ve bayt dizisine bitmap dönüşümüne bulabilirsiniz.Android Bitmap OutOfMemoryError ListView'da

import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 

import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 


public class ListItem { 

private int id; 
private byte [] img; 
private String title; 
private String description; 

public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

public byte[] getImg() { 
    return img; 
} 

public void setImg(byte[] img) { 
    this.img = img; 
} 

public String getTitle() { 
    return title; 
} 

public void setTitle(String title) { 
    this.title = title; 
} 

public String getDescription() { 
    return description; 
} 

public void setDescription(String description) { 
    this.description = description; 
} 

public static byte[] convertBitmapToBytes(Bitmap bmp){ 
    ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
    bmp.compress(Bitmap.CompressFormat.JPEG, 100, stream); 
    byte[] byteArray = stream.toByteArray(); 
    return byteArray; 
} 

public static Bitmap getBitmap(byte [] bitmapdata){ 
    final BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    ByteArrayInputStream inStream = new ByteArrayInputStream(bitmapdata); 
    BitmapFactory.decodeStream(inStream, null, options); 
    // Calculate inSampleSize 
    options.inSampleSize = calculateInSampleSize(options, 50, 50); 

    // Decode bitmap with inSampleSize set 
    options.inJustDecodeBounds = false; 
    Bitmap bmp = BitmapFactory.decodeStream(inStream,null,options); 
    return bmp; 
} 

public static int calculateInSampleSize(
     BitmapFactory.Options options, int reqWidth, int reqHeight) { 
    // Raw height and width of image 
    final int height = options.outHeight; 
    final int width = options.outWidth; 
    int inSampleSize = 1; 

    if (height > reqHeight || width > reqWidth) { 

     final int halfHeight = height/2; 
     final int halfWidth = width/2; 

     // Calculate the largest inSampleSize value that is a power of 2 and keeps both 
     // height and width larger than the requested height and width. 
     while ((halfHeight/inSampleSize) > reqHeight 
       && (halfWidth/inSampleSize) > reqWidth) { 
      inSampleSize *= 2; 
     } 
    } 
    return inSampleSize; 
} 

} 
+0

deneyin 'Manifest.xml'' in ayarlamak için ... ' –

+0

hala aynı hatayı alıyorum – OrdinaryProgrammer

cevap

0

Android, çok kötü bir görüntü belleği yönetimine sahiptir. bu yüzden görüntüleri çok dikkatli kullanmanız gerekiyor. Fortunatelly, görüntü ekranının bakımı için harici bir kütüphaneyle deneyebilirsiniz. Normal görüntü loader'ında deneme yapınız. UIL

0

Resimleri SQLite'de saklamamalısınız. Bunun yerine, Glide/Picasso gibi bir görüntü yükleme/önbelleğe alma kitaplığı kullanın, bunların her ikisini de kutudan görüntüler kullanmak ve önbelleğe almak oldukça kolaydır.

1

Aynı sorunu bir ListView'de var. Etkinliği bırakarak ayrılan belleği serbest bırakarak çözdüm. Bunun için her displayd bitmap için "recycle()" yöntemini çağırdım.

private List<Bitmap> m_displayedBitmaps = new ArrayList<Bitmap>(); 

private List<ImageView> m_displayedGridElements = new ArrayList<ImageView>(); 

// protected void onPause() { 
public void onStop() { 

    // don't forget to free the references to your bitmap 
    for (ImageView currentGridElement : m_displayedGridElements) { 
     currentGridElement.setImageBitmap(null); 
    } 
    m_displayedGridElements.clear(); 

    // recycle each image 
    for (Bitmap currentBitmap : m_displayedBitmaps) { 
     currentBitmap.recycle(); 
    } 
    // clear the list 
    m_displayedBitmaps.clear(); 



    super.onStop(); 
} 
İlgili konular