Aller au contenu

How to avoid OutOfMemory Error?


maren-L2T

Recommended Posts

Hello for All,

I get this problem when load many image in gallery and in gridview. please can You give me solution to avoid this error

01-20 16:55:41.514: E/dalvikvm-heap(10242): 420000-byte external allocation too large   for this process.
01-20 16:55:41.514: E/GraphicsJNI(10242): VM won't let us allocate 420000 bytes

I use this class to load image:

public BitmapManager {
INSTANCE;
private final Map<String, SoftReference<Bitmap>> cache;
private final ExecutorService pool;
private Map<ImageView, String> imageViews = Collections
  .synchronizedMap(new WeakHashMap<ImageView, String>());
private Bitmap placeholder;
BitmapManager() {
 cache = new HashMap<String, SoftReference<Bitmap>>();
 pool = Executors.newFixedThreadPool(5);
}
public void setPlaceholder(Bitmap bmp) {
 placeholder = bmp;
}
public Bitmap getBitmapFromCache(String url) {
 if (cache.containsKey(url)) {
  return cache.get(url).get();
 }
 return null;
}
public void queueJob(final String url, final ImageView imageView,
  final int width, final int height) {
 /* Create handler in UI thread. */
 final Handler handler = new Handler() {
  @Override
  public void handleMessage(Message msg) {
String tag = imageViews.get(imageView);
if (tag != null && tag.equals(url)) {
 if (msg.obj != null) {
  imageView.setImageBitmap((Bitmap) msg.obj);

 } else {
  imageView.setImageBitmap(placeholder);
  Log.d(null, "fail " + url);
 }
}
  }
 };
 pool.submit(new Runnable() {
  @Override
  public void run() {
final Bitmap bmp = downloadBitmap(url, width, height);
Message message = Message.obtain();
message.obj = bmp;
Log.d(null, "Item downloaded: " + url);
handler.sendMessage(message);
  }
 });
}
public void loadBitmap(final String url, final ImageView imageView,
  final int width, final int height) {
 imageViews.put(imageView, url);
 Bitmap bitmap = getBitmapFromCache(url);
 // check in UI thread, so no concurrency issues
 if (bitmap != null) {
  Log.d(null, "Item loaded from cache: " + url);
  imageView.setImageBitmap(bitmap);

 } else {
  imageView.setImageBitmap(placeholder);
  queueJob(url, imageView, width, height);
 }
}

private Bitmap downloadBitmap(String url, int width, int height) {
 Bitmap bitmap = null;
 try {


  BitmapFactory.Options o = new BitmapFactory.Options();
	 o.inJustDecodeBounds = true;
//	b = BitmapFactory.decodeStream((InputStream) new URL(	url).getContent(),null,o);

  Functions.PrintToConsole(url);
  /*int scale=1;
	 if (o.outHeight > 120000 || o.outWidth > 120000) {
		 scale = (int)Math.pow(2, (int) Math.round(Math.log(120000 / (double) Math.max(o.outHeight, o.outWidth)) / Math.log(0.5)));
	 }
	 */
	 BitmapFactory.Options o2 = new BitmapFactory.Options();
	 o2.inSampleSize=0;

	 bitmap = BitmapFactory.decodeStream((InputStream) new URL( url).getContent(), null, o2);

   //  b.recycle();


  //bitmap = Bitmap.createScaledBitmap(bitmap, width, height, true);
  cache.put(url, new SoftReference<Bitmap>(bitmap));


  return bitmap;
 } catch (MalformedURLException e) {
  e.printStackTrace();
 } catch (IOException e) {
  e.printStackTrace();
 }
 catch(OutOfMemoryError em)
 {
  Functions.PrintToConsole(em.getMessage());
 }


 return null;
}


}

Thanks for help

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...