走出一条具有图像记忆错误图像、错误、记忆

2023-09-04 05:35:06 作者:雲深不知處

我是显示图像的列表视图和获得内存不足的错误任何一个指导我该如何解决这个问题,这是我的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

推荐答案

我终于解决了这个高分辨率图像的问题,其使用以下线程导致内存不足的错误 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);


    }