0

I am using a ViewPager with a PagerAdapter to show one ImageView per page. The images are full screen but they are not even that large: 120-320 kb per picture and 720 x 940 px resolution.

My code is supposed to destroy the ImageView when changing pages. I am getting the Out of Memory error after when loading the 4th picture every time and crashes my app.

Why am I getting this Out of Memory error?!

My Pager Adapter

public class AvatarPickerPagerAdapter extends PagerAdapter {

    @Override
    public void destroyItem(View collection, int position, Object o) {
        View view = (View)o;
        ((ViewPager) collection).removeView(view);
        view = null;
    }

    @Override
    public void finishUpdate(View arg0) {

    }

    @Override
    public int getCount() {
        return avatars.length;
    }

    @Override
    public Object instantiateItem(View context, int position) {
        ImageView avatar = new ImageView(getActivity());
//      imageView.findViewById(R.id.avatar);
        avatar.setImageDrawable(context.getResources().getDrawable(avatarResources[position]));
//      imageView.setImageBitmap(BitmapFactory.decodeResource(getResources(), avatarResources[position]));

        ((ViewPager) context).addView(avatar);

        return avatar;
    }

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

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

    }

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

    @Override
    public void startUpdate(View arg0) {

    }
}

Stack Trace

06-03 15:11:56.656: E/dalvikvm-heap(14156): Out of memory on a 10828816-byte allocation.
06-03 15:11:56.656: I/dalvikvm(14156): "main" prio=5 tid=1 RUNNABLE
06-03 15:11:56.656: I/dalvikvm(14156):   | group="main" sCount=0 dsCount=0 obj=0x412fc6a0 self=0x412e3c18
06-03 15:11:56.656: I/dalvikvm(14156):   | sysTid=14156 nice=0 sched=0/0 cgrp=apps handle=1074821200
06-03 15:11:56.656: I/dalvikvm(14156):   | schedstat=( 0 0 0 ) utm=443 stm=124 core=0
06-03 15:11:56.666: I/dalvikvm(14156):   at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
06-03 15:11:56.666: I/dalvikvm(14156):   at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:592)
06-03 15:11:56.666: I/dalvikvm(14156):   at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:445)
06-03 15:11:56.666: I/dalvikvm(14156):   at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:781)
06-03 15:11:56.666: I/dalvikvm(14156):   at android.content.res.Resources.loadDrawable(Resources.java:1963)
06-03 15:11:56.666: I/dalvikvm(14156):   at android.content.res.Resources.getDrawable(Resources.java:672)
06-03 15:11:56.666: I/dalvikvm(14156):   at com.walintukai.lfdate.AvatarPickerFragment$AvatarPickerPagerAdapter.instantiateItem(AvatarPickerFragment.java:143)
06-03 15:11:56.666: I/dalvikvm(14156):   at android.support.v4.view.PagerAdapter.instantiateItem(PagerAdapter.java:110)
06-03 15:11:56.666: I/dalvikvm(14156):   at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:832)
06-03 15:11:56.666: I/dalvikvm(14156):   at android.support.v4.view.ViewPager.populate(ViewPager.java:1048)
06-03 15:11:56.666: I/dalvikvm(14156):   at android.support.v4.view.ViewPager.populate(ViewPager.java:914)
06-03 15:11:56.666: I/dalvikvm(14156):   at android.support.v4.view.ViewPager$3.run(ViewPager.java:244)
06-03 15:11:56.676: I/dalvikvm(14156):   at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
06-03 15:11:56.676: I/dalvikvm(14156):   at android.view.Choreographer.doCallbacks(Choreographer.java:555)
06-03 15:11:56.676: I/dalvikvm(14156):   at android.view.Choreographer.doFrame(Choreographer.java:524)
06-03 15:11:56.676: I/dalvikvm(14156):   at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
06-03 15:11:56.676: I/dalvikvm(14156):   at android.os.Handler.handleCallback(Handler.java:615)
06-03 15:11:56.676: I/dalvikvm(14156):   at android.os.Handler.dispatchMessage(Handler.java:92)
06-03 15:11:56.676: I/dalvikvm(14156):   at android.os.Looper.loop(Looper.java:137)
06-03 15:11:56.676: I/dalvikvm(14156):   at android.app.ActivityThread.main(ActivityThread.java:4950)
06-03 15:11:56.676: I/dalvikvm(14156):   at java.lang.reflect.Method.invokeNative(Native Method)
06-03 15:11:56.676: I/dalvikvm(14156):   at java.lang.reflect.Method.invoke(Method.java:511)
06-03 15:11:56.676: I/dalvikvm(14156):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004)
06-03 15:11:56.676: I/dalvikvm(14156):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771)
06-03 15:11:56.676: I/dalvikvm(14156):   at dalvik.system.NativeStart.main(Native Method)
The Nomad
  • 7,155
  • 14
  • 65
  • 100
  • 1
    Keep in mind the compressed size on disk isn't the same as the bitmap's size in memory. For a 720x940 image, the actual memory used is 2.58 megabytes (assuming default 4 bytes per pixel). – Krylez Jun 03 '14 at 23:25
  • @Krylez Ohhh, I see. I guess I should scale my images down some more. Wonder if this means my code for recycling is working and that one image by itself gives the `Out of Memory` error? – The Nomad Jun 03 '14 at 23:47

0 Answers0