maren-L2T Posté(e) 20 janvier 2012 Share Posté(e) 20 janvier 2012 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 More sharing options...
Recommended Posts
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.