错误由:java.lang.OutOfMemoryError加载图像

时间:2014-05-26 21:19:50

标签: android out-of-memory android-image universal-image-loader

这是我在后台加载图像的方法,通常是第一次和第二次加载。但是在这些加载之后,会出现内存错误。我该如何解决这个问题?

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;
}

}
是的,我找到了代码并多次调用按活动填写图片

private Drawable getImageFromUrl(String url)throws Exception {         返回Drawable.createFromStream((InputStream)new URL(url).getContent(),“src”);     在这里输入代码

}

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
        }

    }
}

使用picaso

在这里输入代码

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;
}

}

和其他活动使用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

这是堆栈跟踪:

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

1 个答案:

答案 0 :(得分:0)

您遇到的问题是,由于您尝试操作Bitmap的大小,手机的内存不足Bitmaps。确保您使用的分辨率有意义。

有许多优秀的异步图像下载库可用。我可以建议Picasso。它甚至还有辅助方法,可以轻松调整图像大小。