-1

I am trying to implement paging in one activity but I keep running out of memory. The app runs till the 4th page but when it gets to the 5th it crashes. I've tried increasing the JVM heap size but the app still crashes at this one point where it runs out of memory to allocate.

This is my main file:

public class S1Intro extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_s1);

    MyPagerAdapter adapter = new MyPagerAdapter();
    ViewPager myPager = (ViewPager) findViewById(R.id.intro_panels);
    myPager.setAdapter(adapter);
    myPager.setCurrentItem(0);
}

Intent intent = new Intent(S1Intro.this,S2CharacterIntro.class);

public void nextScreen(View view){
    startActivity(intent);
}

This is the PageAdapter Class:

public class MyPagerAdapter extends PagerAdapter {

public int getCount() {
    return 5;
}

public Object instantiateItem(View collection, int position) {

    LayoutInflater inflater = (LayoutInflater) collection.getContext()
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    int resId = 0;
    switch (position) {
        case 0:
            resId = R.layout.s1a;
            break;
        case 1:
            resId = R.layout.s1b;
            break;
        case 2:
            resId = R.layout.s1c;
            break;
        case 3:
            resId = R.layout.s1d;
            break;
        case 4:
            resId = R.layout.s1e;
            break;
    }

    View view = inflater.inflate(resId, null);

    ((ViewPager) collection).addView(view, 0);

    return view;
}

@Override
public void destroyItem(View arg0, int arg1, Object arg2) {
    ((ViewPager) arg0).removeView((View) arg2);

}


@Override
public boolean isViewFromObject(View arg0, Object arg1) {
    return arg0 == ((View) arg1);

}

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

}

This is the 1st page's xml file:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:src="@drawable/a"/>
</LinearLayout>

All the other pages are just like this with different drawables. Except the 5th page, which looks like this:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_screen2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.miniproject32.writeup.S1Intro">
<ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:src="@drawable/e"/>
<Button
    style="@style/buttonStyle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/button_s1"
    android:text="@string/start"
    android:onClick="nextScreen"/>
</RelativeLayout>

This is the logcat:

03-30 12:17:31.866 498-498/? I/art: Starting a blocking GC Alloc
03-30 12:17:31.866 498-498/? I/art: Starting a blocking GC Alloc
03-30 12:17:31.896 498-498/? I/art: Alloc sticky concurrent mark sweep GC freed 1003(75KB) AllocSpace objects, 0(0B) LOS objects, 17% free, 74MB/89MB, paused 885us total 33.721ms
03-30 12:17:31.896 498-498/? I/art: Starting a blocking GC Alloc
03-30 12:17:31.906 1139-1139/? D/ResourcesManager: For user 0 new overlays fetched Null
03-30 12:17:31.916 498-498/? I/art: Alloc partial concurrent mark sweep GC freed 71(2848B) AllocSpace objects, 0(0B) LOS objects, 17% free, 74MB/90MB, paused 823us total 17.333ms
03-30 12:17:31.916 498-498/? I/art: Starting a blocking GC Alloc
03-30 12:17:31.946 498-498/? I/art: Alloc concurrent mark sweep GC freed 115(20KB) AllocSpace objects, 0(0B) LOS objects, 17% free, 74MB/90MB, paused 885us total 24.108ms
03-30 12:17:31.946 498-498/? I/art: Forcing collection of SoftReferences for 36MB allocation
03-30 12:17:31.946 498-498/? I/art: Starting a blocking GC Alloc
03-30 12:17:31.946 612-836/? D/ResourcesManager: For user 0 new overlays fetched Null
03-30 12:17:31.966 498-504/? W/art: Suspending all threads took: 19.805ms
03-30 12:17:31.966 498-498/? I/art: Alloc concurrent mark sweep GC freed 11(344B) AllocSpace objects, 0(0B) LOS objects, 17% free, 74MB/90MB, paused 1.434ms total 23.834ms
03-30 12:17:31.966 498-498/? W/art: Throwing OutOfMemoryError "Failed to allocate a 38125292 byte allocation with 16777216 free bytes and 21MB until OOM"
03-30 12:17:31.976 498-498/? I/art: Starting a blocking GC Alloc
03-30 12:17:31.976 498-498/? I/art: Starting a blocking GC Alloc
03-30 12:17:31.976 612-836/? D/ResourcesManager: For user 0 new overlays fetched Null
03-30 12:17:31.986 498-498/? I/art: Alloc sticky concurrent mark sweep GC freed 3(1264B) AllocSpace objects, 0(0B) LOS objects, 17% free, 74MB/90MB, paused 915us total 10.620ms
03-30 12:17:31.986 498-498/? I/art: Starting a blocking GC Alloc
03-30 12:17:31.986 612-612/? I/IntowowAdapter: not wifi, stop request intowow ad
03-30 12:17:31.996 498-498/? I/art: Alloc partial concurrent mark sweep GC freed 10(320B) AllocSpace objects, 0(0B) LOS objects, 17% free, 74MB/90MB, paused 885us total 13.458ms
03-30 12:17:31.996 498-498/? I/art: Starting a blocking GC Alloc
03-30 12:17:32.026 498-498/? I/art: Alloc concurrent mark sweep GC freed 3(96B) AllocSpace objects, 0(0B) LOS objects, 17% free, 74MB/90MB, paused 1.068ms total 25.024ms
03-30 12:17:32.026 498-498/? I/art: Forcing collection of SoftReferences for 36MB allocation
03-30 12:17:32.026 498-498/? I/art: Starting a blocking GC Alloc
03-30 12:17:32.056 498-498/? I/art: Alloc concurrent mark sweep GC freed 3(96B) AllocSpace objects, 0(0B) LOS objects, 17% free, 74MB/90MB, paused 885us total 24.536ms
03-30 12:17:32.056 498-498/? W/art: Throwing OutOfMemoryError "Failed to allocate a 38125292 byte allocation with 16777216 free bytes and 21MB until OOM"
03-30 12:17:32.056 498-498/? D/skia: --- allocation failed for scaled bitmap
03-30 12:17:32.056 612-612/? I/KBattery: [PLACE] at com.ijinshan.kbatterydoctor.cloud.NewRemoteCloudConfigHelper.b(NewRemoteCloudConfigHelper.java:600)
                                     [NewRemoteCloudConfigHelper]isPackedNotification lastAid = 9
03-30 12:17:32.056 498-498/? E/InputEventReceiver: Exception dispatching input event.
03-30 12:17:32.066 498-498/? E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback
03-30 12:17:32.086 612-612/? I/Choreographer: Skipped 81 frames!  The application may be doing too much work on its main thread.
03-30 12:17:32.096 498-498/? E/MessageQueue-JNI: java.lang.OutOfMemoryError: Failed to allocate a 38125292 byte allocation with 16777216 free bytes and 21MB until OOM
                                                 at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
                                                 at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
                                                 at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:856)
                                                 at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:675)
                                                 at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:2230)
                                                 at android.content.res.Resources.loadDrawableForCookie(Resources.java:4279)
                                                 at android.content.res.Resources.loadDrawable(Resources.java:4153)
                                                 at android.content.res.Resources.loadDrawable(Resources.java:3998)
                                                 at android.content.res.TypedArray.getDrawable(TypedArray.java:886)
                                                 at android.widget.ImageView.<init>(ImageView.java:157)
                                                 at android.widget.ImageView.<init>(ImageView.java:145)
                                                 at android.support.v7.widget.AppCompatImageView.<init>(AppCompatImageView.java:60)
                                                 at android.support.v7.widget.AppCompatImageView.<init>(AppCompatImageView.java:56)
                                                 at android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:106)
                                                 at android.support.v7.app.AppCompatDelegateImplV9.createView(AppCompatDelegateImplV9.java:1017)
                                                 at android.support.v7.app.AppCompatDelegateImplV9.onCreateView(AppCompatDelegateImplV9.java:1076)
                                                 at android.support.v4.view.LayoutInflaterCompatHC$FactoryWrapperHC.onCreateView(LayoutInflaterCompatHC.java:44)
                                                 at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:758)
                                                 at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:716)
                                                 at android.view.LayoutInflater.rInflate(LayoutInflater.java:847)
                                                 at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:810)
                                                 at android.view.LayoutInflater.inflate(LayoutInflater.java:527)
                                                 at android.view.LayoutInflater.inflate(LayoutInflater.java:429)
                                                 at android.view.LayoutInflater.inflate(LayoutInflater.java:380)
                                                 at com.miniproject32.writeup.MyPagerAdapter.instantiateItem(MyPagerAdapter.java:40)
                                                 at android.support.v4.view.PagerAdapter.instantiateItem(PagerAdapter.java:111)
                                                 at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:1038)
                                                 at android.support.v4.view.ViewPager.populate(ViewPager.java:1252)
                                                 at android.support.v4.view.ViewPager.populate(ViewPager.java:1120)
                                                 at android.support.v4.view.ViewPager$3.run(ViewPager.java:277)
                                                 at android.support.v4.view.ViewPager.completeScroll(ViewPager.java:2029)
                                                 at android.support.v4.view.ViewPager.onInterceptTouchEvent(ViewPager.java:2159)
                                                 at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2371)
                                                 at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2844)
                                                 at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2461)
                                                 at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2844)
                                                 at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2461)
                                                 at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2844)
                                                 at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2461)
                                                 at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2844)
                                                 at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2461)
                                                 at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2844)
                                                 at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2461)
                                                 at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2844)
                                                 at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2461)
                                                 at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2844)
                                                 at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2461)
                                                 at com.android.internal.policy.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2866)
                                                 at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1861)
                                                 at android.app.Activity.dispatchTouchEvent(Activity.java:3061)
                                                 at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:67)
                                                 at com.android.internal.policy.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2827)
                                                a
03-30 12:17:32.096 498-498/? D/AndroidRuntime: Shutting down VM
03-30 12:17:32.106 498-498/? E/AndroidRuntime: FATAL EXCEPTION: main
                                           Process: com.miniproject32.writeup, PID: 498
                                           java.lang.OutOfMemoryError: Failed to allocate a 38125292 byte allocation with 16777216 free bytes and 21MB until OOM
                                               at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
                                               at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
                                               at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:856)
                                               at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:675)
                                               at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:2230)
                                               at android.content.res.Resources.loadDrawableForCookie(Resources.java:4279)
                                               at android.content.res.Resources.loadDrawable(Resources.java:4153)
                                               at android.content.res.Resources.loadDrawable(Resources.java:3998)
                                               at android.content.res.TypedArray.getDrawable(TypedArray.java:886)
                                               at android.widget.ImageView.<init>(ImageView.java:157)
                                               at android.widget.ImageView.<init>(ImageView.java:145)
                                               at android.support.v7.widget.AppCompatImageView.<init>(AppCompatImageView.java:60)
                                               at android.support.v7.widget.AppCompatImageView.<init>(AppCompatImageView.java:56)
                                               at android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:106)
                                               at android.support.v7.app.AppCompatDelegateImplV9.createView(AppCompatDelegateImplV9.java:1017)
                                               at android.support.v7.app.AppCompatDelegateImplV9.onCreateView(AppCompatDelegateImplV9.java:1076)
                                               at android.support.v4.view.LayoutInflaterCompatHC$FactoryWrapperHC.onCreateView(LayoutInflaterCompatHC.java:44)
                                               at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:758)
                                               at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:716)
                                               at android.view.LayoutInflater.rInflate(LayoutInflater.java:847)
                                               at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:810)
                                               at android.view.LayoutInflater.inflate(LayoutInflater.java:527)
                                               at android.view.LayoutInflater.inflate(LayoutInflater.java:429)
                                               at android.view.LayoutInflater.inflate(LayoutInflater.java:380)
                                               at com.miniproject32.writeup.MyPagerAdapter.instantiateItem(MyPagerAdapter.java:40)
                                               at android.support.v4.view.PagerAdapter.instantiateItem(PagerAdapter.java:111)
                                               at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:1038)
                                               at android.support.v4.view.ViewPager.populate(ViewPager.java:1252)
                                               at android.support.v4.view.ViewPager.populate(ViewPager.java:1120)
                                               at android.support.v4.view.ViewPager$3.run(ViewPager.java:277)
                                               at android.support.v4.view.ViewPager.completeScroll(ViewPager.java:2029)
                                               at android.support.v4.view.ViewPager.onInterceptTouchEvent(ViewPager.java:2159)
                                               at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2371)
                                               at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2844)
                                               at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2461)
                                               at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2844)
                                               at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2461)
                                               at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2844)
                                               at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2461)
                                               at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2844)
                                               at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2461)
                                               at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2844)
                                               at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2461)
                                               at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2844)
                                               at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2461)
                                               at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2844)
                                               at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2461)
                                               at com.android.internal.policy.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2866)
                                               at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1861)
                                               at android.app.Activity.dispatchTouchEvent(Activity.java:3061)
                                               at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:67)
                                            at com.android.internal.policy.P

How do I fix this? Please help

azizbekian
  • 60,783
  • 13
  • 169
  • 249
Arshiya
  • 47
  • 1
  • 6

4 Answers4

9

java.lang.OutOfMemoryError: Failed to allocate a 38125292 byte allocation with 16777216 free bytes and 21MB until OOM

You are trying to allocate an image that weighs 38MB. It's too much.

Either you make the source image weigh less, or you have to downsample the image and then load it.

Community
  • 1
  • 1
azizbekian
  • 60,783
  • 13
  • 169
  • 249
6

Try to load image using Glide or Picasso.

For Glide

into Project level build.gradle

dependencies {
    compile 'com.github.bumptech.glide:glide:3.5.2'
    compile 'com.android.support:support-v4:22.0.0'
}

while displaying image,

Glide.with(context)
    .load("imageURL")
    .into(ivImg);

For Piccaso

dependencies {
    compile 'com.squareup.picasso:picasso:2.5.1'
}

while displaying image,

Picasso.with(context)
    .load(imageURL)
    .into(ivImg);
Rushabh Shah
  • 371
  • 1
  • 7
  • 22
0

You add this code android:largeHeap="true" in your manifest. Then, you can follow this step

  1. Go to Run -> Run Configurations
  2. Select project under maven build
  3. Select tab "JRE"
  4. Enter -Xmx1024m

Alternatively, you could do

  1. Go to Run -> Run Configurations
  2. Select tab "JRE"
  3. Enter -Xmx1024m

This should increase the memory heap for all the builds/projects. You can optimize it the way you want.

Pang
  • 9,564
  • 146
  • 81
  • 122
MAS. John
  • 582
  • 6
  • 22
  • 2
    This is like saying "you can fix your memory leak by increasing the amount of memory available". Sure, it works, but it promotes bad habits -- like not fixing memory leaks. In this case, the better thing to do is to _not allocate 38MB of memory in the first place_, not make it fail to cause problems until you've used up an entire gigabyte of memory. – Nic Apr 08 '17 at 00:15
0

Try to load image using Glide or Picasso.

For Glide

into Project level build.gradle

dependencies {
    compile 'com.github.bumptech.glide:glide:3.5.2'
    compile 'com.android.support:support-v4:22.0.0'
}

while displaying image,

Glide.with(context)
    .load("imageURL")
    .into(ivImg);

For Piccaso

dependencies {
    compile 'com.squareup.picasso:picasso:2.5.1'
}

while displaying image,

Picasso.with(context)
    .load(imageURL)
    .into(ivImg);
Rushabh Shah
  • 371
  • 1
  • 7
  • 22