0

I'm new to Android and I am trying to implement a ViewPager for image browsing. I am using a library called UrlImageViewHelper to load in the images from URL strings. I am having trouble with a memory leak after scrolling through the first 4-5 images.

Here is the Page Adapter code I am using:

private class ImagePagerAdapter extends PagerAdapter {

    private ArrayList<String> images = new ArrayList<String>();
    private LayoutInflater inflater;

    ImagePagerAdapter(ArrayList<String> imageUrls) {
        this.images = imageUrls;
        inflater = getLayoutInflater();
    }

    @Override
    public void destroyItem(ViewGroup container, int position ,Object object) {
        ((ViewPager) container).removeView((View) object);

    }

    @Override
    public int getCount() {
        return images.size();
    }

    @Override
    public Object instantiateItem(ViewGroup view, int position) {
        View imageLayout = inflater.inflate(R.layout.activity_imagedetailitem, view, false);
        ImageView imageView = (ImageView) imageLayout.findViewById(R.id.detailImage);

        UrlImageViewHelper.setUrlDrawable(imageView, imageUrls.get(position));

        ((ViewPager) view).addView(imageLayout, 0);
        return imageLayout;

    }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view.equals(object);
        }

       @Override  
       public void finishUpdate(View arg0) {}  

       @Override  
       public void restoreState(Parcelable arg0, ClassLoader arg1) {}  

       @Override  
       public Parcelable saveState() {  
           return null;  
       }  

       @Override  
       public void startUpdate(View arg0) {}  

     }  //end of page adapter

Pretty basic code but there must be something I'm missing? If I can provide more information, let me know. Thanks all.

Code from within UrlImageViewHelper library:

/**
 * Download and shrink an Image located at a specified URL, and display it
 * in the provided {@link ImageView} once it finishes loading.
 *
 * @param imageView The {@link ImageView} to display the image to after it
 *            is loaded.
 * @param url The URL of the image that should be loaded.
 */
public static void setUrlDrawable(final ImageView imageView, final String url) {
    setUrlDrawable(imageView.getContext(), imageView, url, null, CACHE_DURATION_THREE_DAYS, null);
}

Here is the exception that in thrown in LogCat:

04-02 09:53:08.975: E/AndroidRuntime(23001): FATAL EXCEPTION: AsyncTask #2
04-02 09:53:08.975: E/AndroidRuntime(23001): java.lang.RuntimeException: An error occured while executing doInBackground()
04-02 09:53:08.975: E/AndroidRuntime(23001):    at android.os.AsyncTask$3.done(AsyncTask.java:200)
04-02 09:53:08.975: E/AndroidRuntime(23001):    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
04-02 09:53:08.975: E/AndroidRuntime(23001):    at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
04-02 09:53:08.975: E/AndroidRuntime(23001):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
04-02 09:53:08.975: E/AndroidRuntime(23001):    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
04-02 09:53:08.975: E/AndroidRuntime(23001):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
04-02 09:53:08.975: E/AndroidRuntime(23001):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
04-02 09:53:08.975: E/AndroidRuntime(23001):    at java.lang.Thread.run(Thread.java:1027)
04-02 09:53:08.975: E/AndroidRuntime(23001): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget(Heap Size=6983KB, Allocated=3582KB, Bitmap Size=25132KB)
04-02 09:53:08.975: E/AndroidRuntime(23001):    at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
04-02 09:53:08.975: E/AndroidRuntime(23001):    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:694)
04-02 09:53:08.975: E/AndroidRuntime(23001):    at com.koushikdutta.urlimageviewhelper.UrlImageViewHelper.loadBitmapFromStream(UrlImageViewHelper.java:117)
04-02 09:53:08.975: E/AndroidRuntime(23001):    at com.koushikdutta.urlimageviewhelper.UrlImageViewHelper.access$3(UrlImageViewHelper.java:94)
04-02 09:53:08.975: E/AndroidRuntime(23001):    at com.koushikdutta.urlimageviewhelper.UrlImageViewHelper$1.onDownloadComplete(UrlImageViewHelper.java:589)
04-02 09:53:08.975: E/AndroidRuntime(23001):    at com.koushikdutta.urlimageviewhelper.UrlImageViewHelper$3.doInBackground(UrlImageViewHelper.java:655)
04-02 09:53:08.975: E/AndroidRuntime(23001):    at com.koushikdutta.urlimageviewhelper.UrlImageViewHelper$3.doInBackground(UrlImageViewHelper.java:1)
04-02 09:53:08.975: E/AndroidRuntime(23001):    at android.os.AsyncTask$2.call(AsyncTask.java:185)
04-02 09:53:08.975: E/AndroidRuntime(23001):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
04-02 09:53:08.975: E/AndroidRuntime(23001):    ... 4 more

Thanks for looking.

Marcin Orlowski
  • 72,056
  • 11
  • 123
  • 141
Jordan Clifton
  • 321
  • 1
  • 3
  • 10

2 Answers2

1

Just override this method ...

@Override
public void destroyItem(View collection, int position, Object view) {
    ((ViewPager) collection).removeView((View) view);
    collection = null;
}
Sazzad Hissain Khan
  • 37,929
  • 33
  • 189
  • 256
0
java.lang.OutOfMemoryError: bitmap size exceeds VM budget(Heap Size=6983KB, Allocated=3582KB, Bitmap Size=25132KB)

I'd rethink what you doing as basically 25MB bitmap is not gonna load comparing to number of bytes you can use.

Marcin Orlowski
  • 72,056
  • 11
  • 123
  • 141
  • Does the 25MB bitmap size basically mean that the bitmaps are not getting released correctly? – Jordan Clifton Apr 02 '13 at 15:01
  • Not seeing files you try to load I do not know at the moment, but if you dig into posts listed on the right, into "Related" column, then I think that would be good start. – Marcin Orlowski Apr 02 '13 at 16:50