Search code examples
androidout-of-memoryandroid-imageuniversal-image-loader

error Caused by: java.lang.OutOfMemoryError Load Image


This is my method to load images in background, the first and second load normally. But after these loading, a memory error appears. How can I fix this?

public class MainArrayAdapterViewHolder extends ArrayAdapter<EmpresaListaPrincipal> {

private final Context context;
private ArrayList<EmpresaListaPrincipal> data_array;
public DisplayImageOptions options;
public ImageLoader imageLoader = ImageLoader.getInstance();

public MainArrayAdapterViewHolder(Context context, ArrayList<EmpresaListaPrincipal> list_of_ids) {

    super(context, R.layout.main_list_rowlayout, list_of_ids);
    this.context = context;
    this.data_array = list_of_ids;


    //------------- read more here https://github.com/nostra13/Android-Universal-Image-Loader 

    options = new DisplayImageOptions.Builder().showImageForEmptyUri(R.drawable.ic_launcher).showImageOnFail(R.drawable.ic_launcher).resetViewBeforeLoading()
            .cacheOnDisc().imageScaleType(ImageScaleType.IN_SAMPLE_INT).bitmapConfig(Bitmap.Config.RGB_565).delayBeforeLoading(0).build();

    File cacheDir = StorageUtils.getCacheDirectory(context);
    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context).memoryCacheExtraOptions(720, 1280) // default = device screen
                                                                                                                        // dimensions
            .discCacheExtraOptions(720, 1280, CompressFormat.JPEG, 100).threadPoolSize(3) // default
            .threadPriority(Thread.NORM_PRIORITY - 1) // default
            .memoryCacheSize(2 * 1024 * 1024).discCache(new UnlimitedDiscCache(cacheDir)) // default
            .discCacheSize(50 * 1024 * 1024).discCacheFileCount(100).discCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default
            .imageDownloader(new BaseImageDownloader(context)) // default
            .tasksProcessingOrder(QueueProcessingType.FIFO) // default
            .defaultDisplayImageOptions(options) // default
            .build();

    imageLoader.init(config);

}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

     ViewHolder viewholder;

     View v = convertView;


    //Asociamos el layout de la lista que hemos creado e incrustamos el ViewHolder
        if(convertView == null){

            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            //View rowView = inflater.inflate(R.layout.main_list_rowlayout, parent, false);

             v = inflater.inflate(R.layout.main_list_rowlayout, parent, false);

             viewholder = new ViewHolder();


             viewholder.textView_main_row_title = (TextView) v.findViewById(R.id.textView_main_row_title);
                viewholder.imageView_restaurant_icon = (ImageView) v.findViewById(R.id.imageView_restaurant_icon);
                viewholder.textView_main_row_direccion = (TextView) v.findViewById(R.id.textView_main_row_direccion);
                v.setTag(viewholder);


        }

    ImageLoadingListener mImageLoadingListenr = new ImageLoadingListener() {

        @Override
        public void onLoadingStarted(String arg0, View arg1) {
            // Log.e("* started *", String.valueOf("complete"));

        }



        @Override
        public void onLoadingComplete(String arg0, View arg1, Bitmap arg2) {
            // Log.e("* complete *", String.valueOf("complete"));
        }

        @Override
        public void onLoadingCancelled(String arg0, View arg1) {

        }

        @Override
        public void onLoadingFailed(String arg0, View arg1, FailReason arg2) {
            // TODO Auto-generated method stub

        }
    };

    try {

         viewholder = (ViewHolder) v.getTag();

          viewholder.textView_main_row_title.setText(data_array.get(position).getNOMBRE());
          viewholder.textView_main_row_direccion.setText(data_array.get(position).getDIRECCION());


        String image = data_array.get(position).getURL();


        // ------- image ---------
        try {
            if (image.length() > 4) imageLoader.displayImage(image, viewholder.imageView_restaurant_icon, options, mImageLoadingListenr);               
        } catch (Exception ex) {
        }

        //textView_main_row_title.setText(name);
        //textView_main_row_address.setText(address);

    } catch (Exception e) {
        // TODO: handle exception
    }

    return v;
}

public class ViewHolder {
    public TextView textView_main_row_title;
    public TextView textView_main_row_direccion;

    //public TextView cargo;
    public ImageView imageView_restaurant_icon;
}

}

yes, I found code and called several times to fill pictures by activity

private Drawable getImageFromUrl(String url) throws Exception { return Drawable.createFromStream((InputStream)new URL(url).getContent(), "src"); enter code here

}

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
    //declare variable of ImageView
    ImageView bmImage;

    public DownloadImageTask(ImageView bmImage) {
        //initialize variable with the passing ImageView parameter
        this.bmImage = bmImage;
    }

    protected Bitmap doInBackground(String... urls) {
        //get url of image
        String urldisplay = urls[0];
        //create Bitmap variable
        Bitmap mIcon11 = null;
        try {
            //create instance of InputStream and pass URL
            InputStream in = new java.net.URL(urldisplay).openStream();
            //decode stream and initialize bitmap 
            mIcon11 = BitmapFactory.decodeStream(in);
        } catch (Exception e) {
            //show error log

            Log.e("Error", e.getMessage());
            e.printStackTrace();
        }
        //return bitmap
        return mIcon11;
    }

    protected void onPostExecute(Bitmap result) {
        //get bitmap and initialize ImageView
        try {
            bmImage.setImageBitmap(result);

        } catch (Exception e) {
            // TODO: handle exception
        }

    }
}

use picaso

enter code here

public class MainArrayAdapterViewHolder extends ArrayAdapter<EmpresaListaPrincipal> {

private final Context context;
private ArrayList<EmpresaListaPrincipal> data_array;
public DisplayImageOptions options;
public ImageLoader imageLoader = ImageLoader.getInstance();

public MainArrayAdapterViewHolder(Context context, ArrayList<EmpresaListaPrincipal> list_of_ids) {

    super(context, R.layout.main_list_rowlayout, list_of_ids);
    this.context = context;
    this.data_array = list_of_ids;


}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

     ViewHolder viewholder;

     View v = convertView;


    //Asociamos el layout de la lista que hemos creado e incrustamos el ViewHolder
        if(convertView == null){

            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            //View rowView = inflater.inflate(R.layout.main_list_rowlayout, parent, false);

             v = inflater.inflate(R.layout.main_list_rowlayout, parent, false);

             viewholder = new ViewHolder();


             viewholder.textView_main_row_title = (TextView) v.findViewById(R.id.textView_main_row_title);
                viewholder.imageView_restaurant_icon = (ImageView) v.findViewById(R.id.imageView_restaurant_icon);
                viewholder.textView_main_row_direccion = (TextView) v.findViewById(R.id.textView_main_row_direccion);
                v.setTag(viewholder);


        }


    try {

         viewholder = (ViewHolder) v.getTag();

          viewholder.textView_main_row_title.setText(data_array.get(position).getNOMBRE());
          viewholder.textView_main_row_direccion.setText(data_array.get(position).getDIRECCION());


        String image = data_array.get(position).getURL();



        Picasso.with(context)
          .load(image)

          .into(viewholder.imageView_restaurant_icon);

    } catch (Exception e) {
        // TODO: handle exception
    }

    return v;
}

public class ViewHolder {
    public TextView textView_main_row_title;
    public TextView textView_main_row_direccion;

    public ImageView imageView_restaurant_icon;
}

}

and other activity use picaso .

if(ImagenObj != null) {

                            for (int i = 0; i < ImagenObj.length(); i++) {
                                JSONObject c = ImagenObj.getJSONObject(i);

                                // Storing each json item in variable
                                int id = Integer.parseInt( c.getString(ValoresGenerales.TAG_ID));       
                                String nombre = c.getString(ValoresGenerales.TAG_NOMBRE);
                                String url = c.getString(ValoresGenerales.TAG_URL);


                                if(ValoresGenerales.TAG_SECUNDARIA_A.equals(nombre))
                                {
                                    url_A = url;
                                }
                                else if(ValoresGenerales.TAG_SECUNDARIA_B.equals(nombre))
                                {
                                    url_B = url;
                                }
                                else    if(ValoresGenerales.TAG_SECUNDARIA_C.equals(nombre))
                                {
                                    url_C = url;
                                }
                                else    if(ValoresGenerales.TAG_SECUNDARIA_D.equals(nombre))
                                {
                                    url_D = url;
                                }
                                else    if(ValoresGenerales.TAG_ACERCA_DE.equals(nombre))
                                {
                                    url_Acerca_de = url;
                                }




                            }

                            int currentapiVersion = android.os.Build.VERSION.SDK_INT;
                            if(!url_A.equals(""))
                            { 
                                Picasso.with(m_context).load(url_A).into(imageViewA);


                            }
                            if(!url_B.equals(""))
                            {
                                Picasso.with(m_context).load(url_B).into(imageViewB);

                            }
                            if(!url_C.equals(""))
                            {
                                Picasso.with(m_context).load(url_C).into(imageViewC);

                            }
                            if(!url_D.equals(""))
                            {
                                Picasso.with(m_context).load(url_D).into(imageViewD);

                            }

                            if(!url_Acerca_de.equals(""))
                            {

                                Picasso.with(m_context).load(url_Acerca_de).into(iv_acerca_de);


                            }
                            }


enter code here

This is the stacktrace:

05-26 22:57:34.690: E/ActivityThread(22261): Failed to inflate
05-26 22:57:34.690: E/ActivityThread(22261): android.view.InflateException: Binary XML file line #112: Error inflating class <unknown>
05-26 22:57:34.690: E/ActivityThread(22261):    at android.view.LayoutInflater.createView(LayoutInflater.java:613)
05-26 22:57:34.690: E/ActivityThread(22261):    at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
05-26 22:57:34.690: E/ActivityThread(22261):    at android.view.LayoutInflater.onCreateView(LayoutInflater.java:660)
05-26 22:57:34.690: E/ActivityThread(22261):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:685)
05-26 22:57:34.690: E/ActivityThread(22261):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
05-26 22:57:34.690: E/ActivityThread(22261):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
05-26 22:57:34.690: E/ActivityThread(22261):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
05-26 22:57:34.690: E/ActivityThread(22261):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
05-26 22:57:34.690: E/ActivityThread(22261):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
05-26 22:57:34.690: E/ActivityThread(22261):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
05-26 22:57:34.690: E/ActivityThread(22261):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
05-26 22:57:34.690: E/ActivityThread(22261):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
05-26 22:57:34.690: E/ActivityThread(22261):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
05-26 22:57:34.690: E/ActivityThread(22261):    at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
05-26 22:57:34.690: E/ActivityThread(22261):    at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
05-26 22:57:34.690: E/ActivityThread(22261):    at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
05-26 22:57:34.690: E/ActivityThread(22261):    at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:323)
05-26 22:57:34.690: E/ActivityThread(22261):    at android.app.Activity.setContentView(Activity.java:1881)
05-26 22:57:34.690: E/ActivityThread(22261):    at com.example.lookrestaurant.actDetalleRestaurant.onCreate(actDetalleRestaurant.java:94)
05-26 22:57:34.690: E/ActivityThread(22261):    at android.app.Activity.performCreate(Activity.java:5104)
05-26 22:57:34.690: E/ActivityThread(22261):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
05-26 22:57:34.690: E/ActivityThread(22261):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2262)
05-26 22:57:34.690: E/ActivityThread(22261):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2358)
05-26 22:57:34.690: E/ActivityThread(22261):    at android.app.ActivityThread.access$600(ActivityThread.java:153)
05-26 22:57:34.690: E/ActivityThread(22261):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247)
05-26 22:57:34.690: E/ActivityThread(22261):    at android.os.Handler.dispatchMessage(Handler.java:99)
05-26 22:57:34.690: E/ActivityThread(22261):    at android.os.Looper.loop(Looper.java:137)
05-26 22:57:34.690: E/ActivityThread(22261):    at android.app.ActivityThread.main(ActivityThread.java:5227)
05-26 22:57:34.690: E/ActivityThread(22261):    at java.lang.reflect.Method.invokeNative(Native Method)
05-26 22:57:34.690: E/ActivityThread(22261):    at java.lang.reflect.Method.invoke(Method.java:511)
05-26 22:57:34.690: E/ActivityThread(22261):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
05-26 22:57:34.690: E/ActivityThread(22261):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
05-26 22:57:34.690: E/ActivityThread(22261):    at dalvik.system.NativeStart.main(Native Method)
05-26 22:57:34.690: E/ActivityThread(22261): Caused by: java.lang.reflect.InvocationTargetException
05-26 22:57:34.690: E/ActivityThread(22261):    at java.lang.reflect.Constructor.constructNative(Native Method)
05-26 22:57:34.690: E/ActivityThread(22261):    at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
05-26 22:57:34.690: E/ActivityThread(22261):    at android.view.LayoutInflater.createView(LayoutInflater.java:587)
05-26 22:57:34.690: E/ActivityThread(22261):    ... 32 more
05-26 22:57:34.690: E/ActivityThread(22261): Caused by: java.lang.OutOfMemoryError
05-26 22:57:34.690: E/ActivityThread(22261):    at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
05-26 22:57:34.690: E/ActivityThread(22261):    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:502)
05-26 22:57:34.690: E/ActivityThread(22261):    at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:355)
05-26 22:57:34.690: E/ActivityThread(22261):    at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:785)
05-26 22:57:34.690: E/ActivityThread(22261):    at android.content.res.Resources.loadDrawable(Resources.java:1992)
05-26 22:57:34.690: E/ActivityThread(22261):    at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
05-26 22:57:34.690: E/ActivityThread(22261):    at android.widget.ImageView.<init>(ImageView.java:120)
05-26 22:57:34.690: E/ActivityThread(22261):    at android.widget.ImageView.<init>(ImageView.java:110)
05-26 22:57:34.690: E/ActivityThread(22261):    ... 35 more
05-26 22:57:34.690: D/AndroidRuntime(22261): Shutting down VM
05-26 22:57:34.690: W/dalvikvm(22261): threadid=1: thread exiting with uncaught exception (group=0x41001930)
05-26 22:57:34.705: E/AndroidRuntime(22261): FATAL EXCEPTION: main
05-26 22:57:34.705: E/AndroidRuntime(22261): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.lookrestaurant/com.example.lookrestaurant.actDetalleRestaurant}: android.view.InflateException: Binary XML file line #112: Error inflating class <unknown>
05-26 22:57:34.705: E/AndroidRuntime(22261):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2308)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2358)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at android.app.ActivityThread.access$600(ActivityThread.java:153)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at android.os.Handler.dispatchMessage(Handler.java:99)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at android.os.Looper.loop(Looper.java:137)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at android.app.ActivityThread.main(ActivityThread.java:5227)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at java.lang.reflect.Method.invokeNative(Native Method)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at java.lang.reflect.Method.invoke(Method.java:511)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at dalvik.system.NativeStart.main(Native Method)
05-26 22:57:34.705: E/AndroidRuntime(22261): Caused by: android.view.InflateException: Binary XML file line #112: Error inflating class <unknown>
05-26 22:57:34.705: E/AndroidRuntime(22261):    at android.view.LayoutInflater.createView(LayoutInflater.java:613)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at android.view.LayoutInflater.onCreateView(LayoutInflater.java:660)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:685)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:323)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at android.app.Activity.setContentView(Activity.java:1881)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at com.example.lookrestaurant.actDetalleRestaurant.onCreate(actDetalleRestaurant.java:94)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at android.app.Activity.performCreate(Activity.java:5104)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2262)
05-26 22:57:34.705: E/AndroidRuntime(22261):    ... 11 more
05-26 22:57:34.705: E/AndroidRuntime(22261): Caused by: java.lang.reflect.InvocationTargetException
05-26 22:57:34.705: E/AndroidRuntime(22261):    at java.lang.reflect.Constructor.constructNative(Native Method)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at android.view.LayoutInflater.createView(LayoutInflater.java:587)
05-26 22:57:34.705: E/AndroidRuntime(22261):    ... 32 more
05-26 22:57:34.705: E/AndroidRuntime(22261): Caused by: java.lang.OutOfMemoryError
05-26 22:57:34.705: E/AndroidRuntime(22261):    at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:502)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:355)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:785)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at android.content.res.Resources.loadDrawable(Resources.java:1992)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at android.widget.ImageView.<init>(ImageView.java:120)
05-26 22:57:34.705: E/AndroidRuntime(22261):    at android.widget.ImageView.<init>(ImageView.java:110)
05-26 22:57:34.705: E/AndroidRuntime(22261):    ... 35 more
05-26 22:57:35.605: D/dalvikvm(22261): GC_FOR_ALLOC freed 1282K, 25% free 29998K/39940K, paused 22ms, total 25ms
05-26 22:57:36.485: D/dalvikvm(22261): GC_CONCURRENT freed 1883K, 25% free 30130K/39940K, paused 1ms+6ms, total 32ms

Solution

  • The problem you are getting is that the phone is running out of Bitmap memory due to the size of the Bitmaps you are trying to manipulate. Make sure that the resolution you are using makes sense.

    There are plenty of good asynchronous image downloading libraries available. I can suggest Picasso. It even has helper methods that easily allow you to resize images.