走出一条具有图像记忆错误 [英] Out Of Memory Error with images

查看:88
本文介绍了走出一条具有图像记忆错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是显示图像的列表视图和获得内存不足的错误任何一个指导我该如何解决这个问题,这是我的code

i am displaying images in listview and getting out of memory error any one guide me what is the solution to this problem here is my code

LogCat中

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

GetView方法

GetView Method

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

图像缩放功能

image Scale Function

 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;

    }

图像装载机类

Image Loader Class

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

任何帮助,将AP precicated

any help would be apprecicated

推荐答案

我终于解决了这个高分辨率图像的问题,其使用以下线程导致内存不足的错误 <一href="http://stackoverflow.com/questions/3331527/android-resize-a-large-bitmap-file-to-scaled-output-file">Large图像处理

finally i solve this high resolution image issue which was causing out of memory error using following thread Large Image Manipulation

和这里是我的code,根据您的需要的尺寸下载和缩放图像。

and here is my code for downloading and scaling image according to your required size.

没有更多的自定义缩放比例要求的功能!

no more custom scaling function required!!!

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


    }

这篇关于走出一条具有图像记忆错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆