Fuera de error de memoria con imágenes

Estoy mostrando imágenes en listview y salir del error de memoria cualquier guía me cuál es la solución a este problema aquí es mi código

LogCat

ERROR/AndroidRuntime(1010): java.lang.OutOfMemoryError: bitmap size exceeds VM budget ERROR/AndroidRuntime(1010): at android.graphics.BitmapFactory.nativeDecodeByteArray(Native Method) ERROR/AndroidRuntime(1010): at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:405) ERROR/AndroidRuntime(1010): at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:418) ERROR/AndroidRuntime(1010): at com.Adapters.AdapterTours.getView(AdapterTours.java:73) ERROR/AndroidRuntime(1010): at android.widget.AbsListView.obtainView(AbsListView.java:1409) ERROR/AndroidRuntime(1010): at android.widget.ListView.makeAndAddView(ListView.java:1745) ERROR/AndroidRuntime(1010): at android.widget.ListView.fillUp(ListView.java:700) ERROR/AndroidRuntime(1010): at android.widget.ListView.fillGap(ListView.java:646) ERROR/AndroidRuntime(1010): at android.widget.AbsListView.trackMotionScroll(AbsListView.java:3399) ERROR/AndroidRuntime(1010): at android.widget.AbsListView.onTouchEvent(AbsListView.java:2233) ERROR/AndroidRuntime(1010): at android.widget.ListView.onTouchEvent(ListView.java:3446) ERROR/AndroidRuntime(1010): at android.view.View.dispatchTouchEvent(View.java:3885) ERROR/AndroidRuntime(1010): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:903) ERROR/AndroidRuntime(1010): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942) ERROR/AndroidRuntime(1010): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942) ERROR/AndroidRuntime(1010): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942) ERROR/AndroidRuntime(1010): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942) ERROR/AndroidRuntime(1010): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1691) ERROR/AndroidRuntime(1010): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1125) ERROR/AndroidRuntime(1010): at android.app.Activity.dispatchTouchEvent(Activity.java:2096) ERROR/AndroidRuntime(1010): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1675) ERROR/AndroidRuntime(1010): at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2194) ERROR/AndroidRuntime(1010): at android.view.ViewRoot.handleMessage(ViewRoot.java:1878) ERROR/AndroidRuntime(1010): at android.os.Handler.dispatchMessage(Handler.java:99) ERROR/AndroidRuntime(1010): at android.os.Looper.loop(Looper.java:130) ERROR/AndroidRuntime(1010): at android.app.ActivityThread.main(ActivityThread.java:3683) ERROR/AndroidRuntime(1010): at java.lang.reflect.Method.invokeNative(Native Method) ERROR/AndroidRuntime(1010): at java.lang.reflect.Method.invoke(Method.java:507) ERROR/AndroidRuntime(1010): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) ERROR/AndroidRuntime(1010): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) ERROR/AndroidRuntime(1010): at dalvik.system.NativeStart.main(Native Method) 

Método GetView

 public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.list_tours, null); holder = new ViewHolder(); holder.tourTitle = (TextView) convertView.findViewById(R.id.tourTitle); holder.tourIcon = (ImageView) convertView.findViewById(R.id.tourIcon); holder.tourDetail = (TextView) convertView.findViewById(R.id.tourDetail); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } DalTours tour = getItem(position); String tempTag = String.valueOf(tour.getId()); holder.tourIcon.setTag(tempTag); if(tour.getImageByteArray() != null) { Bitmap image = BitmapFactory.decodeByteArray(tour.getImageByteArray(), 0, tour.getImageByteArray().length); holder.tourIcon.setImageDrawable(getScaledImage(image)); image = null; }else { holder.tourIcon.setTag(tour); Bitmap cachedImage = ImageLoader.loadBitmap(tour,new ImageLoader.ImageCallback() { @Override public void imageLoaded(Bitmap imageBitmap, DalTours tour) { ImageView image = (ImageView)listview.findViewWithTag(tour); if(image != null) { try { ByteArrayOutputStream stream = new ByteArrayOutputStream(); if(imageBitmap != null) { image.setImageDrawable(getScaledImage(imageBitmap)); imageBitmap.compress(CompressFormat.PNG, 0 ,stream); byte[] bitmapdata = stream.toByteArray(); tours.get(position).setImageByteArray(bitmapdata); } stream = null; }finally { } } } }); holder.tourIcon.setImageDrawable(getScaledImage(cachedImage)); } holder.tourTitle.setText(tours.get(position).getTitle()); holder.tourDetail.setText(tours.get(position).getDetail()); return convertView; } 

Función de escala de imagen

  public Drawable getScaledImage(Bitmap actualBitmap) { BitmapDrawable bmd= null; if(actualBitmap != null) { int width = actualBitmap.getWidth(); int height = actualBitmap.getHeight(); Activity parent = (Activity)context; Display display = parent.getWindowManager().getDefaultDisplay(); int Screenwidth = display.getWidth(); int Screenheight = display.getHeight(); float newWidth = (Screenwidth*35)/100; float temp = newWidth / width; float newHeight = temp * height; float scaleWidth = ((float) newWidth) / width; float scaleHeight = ((float) newHeight) / height; Matrix matrix = new Matrix(); matrix.postScale(scaleWidth, scaleHeight); Bitmap resizedBitmap = Bitmap.createBitmap(actualBitmap, 0, 0, width, height, matrix, true); bmd = new BitmapDrawable(resizedBitmap); } return bmd; } 

Clase de cargador de imágenes

 public class ImageLoader { private static HashMap<String, SoftReference<Bitmap>> imageCache; public ImageLoader() { //imageCache = new HashMap<String, SoftReference<Bitmap>>(); } public static Bitmap loadBitmap(final DalTours tour, final ImageCallback imageCallback) { if(imageCache == null) imageCache = new HashMap<String, SoftReference<Bitmap>>(); if (imageCache.containsKey(tour.getImageurl())) { SoftReference<Bitmap> softReference = imageCache.get(tour.getImageurl()); Bitmap Bitmap = softReference.get(); if (Bitmap != null) { return Bitmap; } } final Handler handler = new Handler() { @Override public void handleMessage(Message message) { imageCallback.imageLoaded((Bitmap) message.obj, tour); } }; new Thread() { @Override public void run() { Bitmap Bitmap = loadImageFromUrl(tour.getImageurl()); imageCache.put(tour.getImageurl(), new SoftReference<Bitmap>(Bitmap)); Message message = handler.obtainMessage(0, Bitmap); handler.sendMessage(message); } }.start(); return null; } public static Bitmap loadImageFromUrl(String url) { Bitmap bm; try { URL aURL = new URL(url); URLConnection conn = aURL.openConnection(); conn.connect(); InputStream is = null; try { is= conn.getInputStream(); }catch(IOException e) { return null; } BufferedInputStream bis = new BufferedInputStream(is); bm = BitmapFactory.decodeStream(bis); bis.close(); is.close(); } catch (IOException e) { return null; } return bm; } public interface ImageCallback { public void imageLoaded(Bitmap imageBitmap, DalTours tour); } } 

Cualquier ayuda sería apprecicated

Para solucionar java.lang.OutOfMemoryError Excepción en android.graphics.BitmapFactory.nativeDecodeByteArray, debe utilizar el siguiente código:

 BitmapFactory.Options options=new BitmapFactory.Options();// Create object of bitmapfactory's option method for further option use options.inPurgeable = true; // inPurgeable is used to free up memory while required Bitmap songImage1 = BitmapFactory.decodeByteArray(thumbnail,0, thumbnail.length,options);//Decode image, "thumbnail" is the object of image file Bitmap songImage = Bitmap.createScaledBitmap(songImage1, 50 , 50 , true);// convert decoded bitmap into well scalled Bitmap format. imageview.SetImageDrawable(songImage); 

Finalmente resuelvo este problema de imagen de alta resolución que estaba causando errores de memoria usando el siguiente hilo Manipulación de imágenes grandes

Y aquí está mi código para descargar y escalar la imagen de acuerdo a su tamaño requerido.

No más función de escala personalizada necesaria!

 public static Bitmap loadImageFromUrl(String url) { Bitmap bm; try { URL aURL = new URL(url); URLConnection conn = aURL.openConnection(); conn.connect(); InputStream is = null; try { is= conn.getInputStream(); }catch(IOException e) { return null; } BufferedInputStream bis = new BufferedInputStream(is); bm = BitmapFactory.decodeStream(bis); bis.close(); is.close(); } catch (IOException e) { return null; } return Bitmap.createScaledBitmap(bm,100,100,true); } 

Usted tiene que recycle mapa de bits. La implementación de mapa de bits es nativa, por lo que el objeto java es pequeño y un candidato pobre para la recolección de basura de java, pero la memoria todavía se asigna. Taka un vistazo a Bitmap.recycle()

Definitivamente es un caso de tener un mapa de bits para una imagen grande en la memoria. Si está realizando repetidamente esta operación, entonces es bueno reciclar el mapa de bits cada vez. Sin embargo, el solo reciclaje no garantiza que la memoria se libere, apenas se marca para la recolección de basura. Por lo tanto, como un paso adicional, usted debe tener cuidado de recolección de basura también.

Utilice este código;

 Bitmap mybitmap = ....; // you are getting the bitmap here mybitmap.recycle(); System.gc(); // the above recycling may not be enough always 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.