-3

I am developing an App with 4 tabs.

  1. Tab 1: Expandable listview with 20 groups
  2. Tab 2: Expandable listview with 30 groups
  3. Tab 3: Gridview with 22 items (3 column per row) [scrollable] 4.Tab 4: Grid view with 24 items (3 column per row) [scrollable]

My Gridview adapter implementation is below:(Same is used for both tab 3 and 4)

public class LogoImageAdapter extends BaseAdapter{
    private Context context;
    private List<Integer> logoIds;
    public LogoImageAdapter(Context context, List<Integer> logoIds) {
        this.context = context;
        this.logoIds = logoIds;
    }
    @Override
    public int getCount() {
        return logoIds.size();
    }

    @Override
    public Object getItem(int position) {
        return logoIds.get(position);
    }

    @Override
    public long getItemId(int position) {
        return logoIds.get(position);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View gridView;
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            gridView = inflater.inflate(R.layout.grid_item, null);
        } else {
            gridView = convertView;
        }
        /*TextView title = (TextView) gridView.findViewById(R.id.siteNameTV);
            title.setText("Title_" + position);*/
        ImageView logoImage = (ImageView) gridView.findViewById(R.id.logoImageView);
        logoImage.setImageResource(logoIds.get(position));
        return gridView;
    }
}

Thing is that the app consumes almost 100 MB memory and frequently crashes. I think the app crashing is due to my gridview implementation. Where I am making a mistake?

enter image description here

EDIT: Logcat:

10-05 15:06:55.458 32557-32557/pmp.com.instapukkei W/FragmentManager: moveToState: Fragment state for Classified{3fc90a #0 id=0x7f0c006d android:switcher:2131492973:1} not updated inline; expected state 3 found 2
10-05 15:06:57.907 32557-32557/pmp.com.instapukkei W/FragmentManager: moveToState: Fragment state for Tourism{33f7512 #2 id=0x7f0c006d android:switcher:2131492973:2} not updated inline; expected state 3 found 2
10-05 15:06:59.856 32557-32557/pmp.com.instapukkei W/FragmentManager: moveToState: Fragment state for Shopping{6a52599 #3 id=0x7f0c006d android:switcher:2131492973:3} not updated inline; expected state 3 found 2
10-05 15:07:02.252 32557-32557/pmp.com.instapukkei W/FragmentManager: moveToState: Fragment state for Travel{26da709 #4 id=0x7f0c006d android:switcher:2131492973:4} not updated inline; expected state 3 found 2
10-05 15:07:02.387 32557-32568/pmp.com.instapukkei I/art: Clamp target GC heap from 102MB to 96MB
10-05 15:07:07.410 32557-32557/pmp.com.instapukkei W/FragmentManager: moveToState: Fragment state for Tourism{33f7512 #2 id=0x7f0c006d android:switcher:2131492973:2} not updated inline; expected state 3 found 2
10-05 15:07:08.494 32557-32557/pmp.com.instapukkei I/art: Waiting for a blocking GC Alloc
10-05 15:07:08.501 32557-32568/pmp.com.instapukkei I/art: Clamp target GC heap from 103MB to 96MB
10-05 15:07:08.502 32557-32557/pmp.com.instapukkei I/art: WaitForGcToComplete blocked for 8.292ms for cause Alloc
10-05 15:07:08.502 32557-32557/pmp.com.instapukkei I/art: Starting a blocking GC Alloc
10-05 15:07:11.500 32557-32557/pmp.com.instapukkei W/FragmentManager: moveToState: Fragment state for Tourism{33f7512 #2 id=0x7f0c006d android:switcher:2131492973:2} not updated inline; expected state 3 found 2
10-05 15:07:12.775 32557-32557/pmp.com.instapukkei I/art: Starting a blocking GC Alloc
10-05 15:07:12.775 32557-32557/pmp.com.instapukkei I/art: Starting a blocking GC Alloc
10-05 15:07:12.802 32557-32557/pmp.com.instapukkei I/art: Alloc sticky concurrent mark sweep GC freed 481(18KB) AllocSpace objects, 3(3MB) LOS objects, 4% free, 91MB/96MB, paused 465us total 26.676ms
10-05 15:07:12.906 32557-32557/pmp.com.instapukkei I/art: Starting a blocking GC Alloc
10-05 15:07:12.906 32557-32557/pmp.com.instapukkei I/art: Starting a blocking GC Alloc
10-05 15:07:12.917 32557-32557/pmp.com.instapukkei I/art: Clamp target GC heap from 103MB to 96MB
10-05 15:07:12.917 32557-32557/pmp.com.instapukkei I/art: Alloc partial concurrent mark sweep GC freed 840(64KB) AllocSpace objects, 5(7MB) LOS objects, 8% free, 87MB/96MB, paused 599us total 10.801ms
10-05 15:07:14.432 32557-32564/pmp.com.instapukkei I/art: Debugger is no longer active
10-05 15:07:15.214 32557-32557/pmp.com.instapukkei I/art: Starting a blocking GC Alloc
10-05 15:07:15.214 32557-32557/pmp.com.instapukkei I/art: Starting a blocking GC Alloc
10-05 15:07:15.225 32557-32557/pmp.com.instapukkei I/art: Alloc sticky concurrent mark sweep GC freed 250(8KB) AllocSpace objects, 0(0B) LOS objects, 3% free, 92MB/96MB, paused 803us total 10.646ms
10-05 15:07:15.226 32557-32557/pmp.com.instapukkei I/art: Starting a blocking GC Alloc
10-05 15:07:15.237 32557-32557/pmp.com.instapukkei I/art: Clamp target GC heap from 102MB to 96MB
10-05 15:07:15.238 32557-32557/pmp.com.instapukkei I/art: Alloc partial concurrent mark sweep GC freed 727(59KB) AllocSpace objects, 4(6MB) LOS objects, 10% free, 86MB/96MB, paused 467us total 11.147ms
10-05 15:07:15.318 32557-32557/pmp.com.instapukkei I/art: Starting a blocking GC Alloc
10-05 15:07:15.318 32557-32557/pmp.com.instapukkei I/art: Starting a blocking GC Alloc
10-05 15:07:15.323 32557-32557/pmp.com.instapukkei I/art: Starting a blocking GC Alloc
10-05 15:07:15.331 32557-32557/pmp.com.instapukkei I/art: Clamp target GC heap from 109MB to 96MB
10-05 15:07:15.331 32557-32557/pmp.com.instapukkei I/art: Alloc partial concurrent mark sweep GC freed 592(58KB) AllocSpace objects, 0(0B) LOS objects, 2% free, 93MB/96MB, paused 441us total 7.585ms
10-05 15:07:15.331 32557-32557/pmp.com.instapukkei I/art: Starting a blocking GC Alloc
10-05 15:07:15.346 32557-32557/pmp.com.instapukkei I/art: Clamp target GC heap from 109MB to 96MB
10-05 15:07:15.347 32557-32557/pmp.com.instapukkei I/art: Alloc concurrent mark sweep GC freed 10(12KB) AllocSpace objects, 0(0B) LOS objects, 2% free, 93MB/96MB, paused 408us total 14.839ms
10-05 15:07:15.347 32557-32557/pmp.com.instapukkei I/art: Forcing collection of SoftReferences for 3MB allocation
10-05 15:07:15.347 32557-32557/pmp.com.instapukkei I/art: Starting a blocking GC Alloc
10-05 15:07:15.366 32557-32557/pmp.com.instapukkei I/art: Clamp target GC heap from 109MB to 96MB
10-05 15:07:15.366 32557-32557/pmp.com.instapukkei I/art: Alloc concurrent mark sweep GC freed 11(344B) AllocSpace objects, 0(0B) LOS objects, 2% free, 93MB/96MB, paused 459us total 18.639ms
10-05 15:07:15.366 32557-32557/pmp.com.instapukkei W/art: Throwing OutOfMemoryError "Failed to allocate a 3686412 byte allocation with 2923072 free bytes and 2MB until OOM"
10-05 15:07:15.376 32557-32557/pmp.com.instapukkei I/art: Starting a blocking GC Alloc
10-05 15:07:15.376 32557-32557/pmp.com.instapukkei I/art: Starting a blocking GC Alloc
10-05 15:07:15.381 32557-32557/pmp.com.instapukkei I/art: Starting a blocking GC Alloc
10-05 15:07:15.390 32557-32557/pmp.com.instapukkei I/art: Clamp target GC heap from 109MB to 96MB
10-05 15:07:15.390 32557-32557/pmp.com.instapukkei I/art: Alloc partial concurrent mark sweep GC freed 6(192B) AllocSpace objects, 0(0B) LOS objects, 2% free, 93MB/96MB, paused 430us total 8.601ms
10-05 15:07:15.390 32557-32557/pmp.com.instapukkei I/art: Starting a blocking GC Alloc
10-05 15:07:15.405 32557-32557/pmp.com.instapukkei I/art: Clamp target GC heap from 109MB to 96MB
10-05 15:07:15.406 32557-32557/pmp.com.instapukkei I/art: Alloc concurrent mark sweep GC freed 3(96B) AllocSpace objects, 0(0B) LOS objects, 2% free, 93MB/96MB, paused 435us total 14.874ms
10-05 15:07:15.406 32557-32557/pmp.com.instapukkei I/art: Forcing collection of SoftReferences for 3MB allocation
10-05 15:07:15.406 32557-32557/pmp.com.instapukkei I/art: Starting a blocking GC Alloc
10-05 15:07:15.422 32557-32557/pmp.com.instapukkei I/art: Clamp target GC heap from 109MB to 96MB
10-05 15:07:15.422 32557-32557/pmp.com.instapukkei I/art: Alloc concurrent mark sweep GC freed 3(96B) AllocSpace objects, 0(0B) LOS objects, 2% free, 93MB/96MB, paused 420us total 15.551ms
10-05 15:07:15.422 32557-32557/pmp.com.instapukkei W/art: Throwing OutOfMemoryError "Failed to allocate a 3686412 byte allocation with 2916528 free bytes and 2MB until OOM"
10-05 15:07:15.423 32557-32557/pmp.com.instapukkei D/skia: --- allocation failed for scaled bitmap
10-05 15:07:15.423 32557-32557/pmp.com.instapukkei D/AndroidRuntime: Shutting down VM
10-05 15:07:15.453 32557-32557/pmp.com.instapukkei E/AndroidRuntime: FATAL EXCEPTION: main
                                                                     Process: pmp.com.instapukkei, PID: 32557
                                                                     java.lang.OutOfMemoryError: Failed to allocate a 3686412 byte allocation with 2916528 free bytes and 2MB until OOM
                                                                         at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
                                                                         at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
                                                                         at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:609)
                                                                         at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444)
                                                                         at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:1080)
                                                                         at android.content.res.Resources.loadDrawableForCookie(Resources.java:2638)
                                                                         at android.content.res.Resources.loadDrawable(Resources.java:2543)
                                                                         at android.content.res.TypedArray.getDrawable(TypedArray.java:870)
                                                                         at android.graphics.drawable.AnimationDrawable.inflateChildElements(AnimationDrawable.java:330)
                                                                         at android.graphics.drawable.AnimationDrawable.inflate(AnimationDrawable.java:300)
                                                                         at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:1215)
                                                                         at android.graphics.drawable.Drawable.createFromXml(Drawable.java:1124)
                                                                         at android.content.res.Resources.loadDrawableForCookie(Resources.java:2633)
                                                                         at android.content.res.Resources.loadDrawable(Resources.java:2543)
                                                                         at android.content.res.TypedArray.getDrawable(TypedArray.java:870)
                                                                         at android.view.View.<init>(View.java:3957)
                                                                         at android.widget.ImageView.<init>(ImageView.java:155)
                                                                         at android.widget.ImageView.<init>(ImageView.java:150)
                                                                         at android.support.v7.widget.AppCompatImageView.<init>(AppCompatImageView.java:57)
                                                                         at android.support.v7.widget.AppCompatImageView.<init>(AppCompatImageView.java:53)
                                                                         at android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:106)
                                                                         at android.support.v7.app.AppCompatDelegateImplV7.createView(AppCompatDelegateImplV7.java:972)
                                                                         at android.support.v7.app.AppCompatDelegateImplV7.onCreateView(AppCompatDelegateImplV7.java:1031)
                                                                         at android.support.v4.view.LayoutInflaterCompatHC$FactoryWrapperHC.onCreateView(LayoutInflaterCompatHC.java:44)
                                                                         at android.view.LayoutInflater$FactoryMerger.onCreateView(LayoutInflater.java:189)
                                                                         at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:746)
                                                                         at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
                                                                         at android.view.LayoutInflater.rInflate(LayoutInflater.java:835)
                                                                         at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)
                                                                         at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
                                                                         at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
                                                                         at pmp.com.instapukkei.tabs.Tourism.onCreateView(Tourism.java:31)
                                                                         at android.support.v4.app.Fragment.performCreateView(Fragment.java:1974)
                                                                         at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
                                                                         at android.support.v4.app.FragmentManagerImpl.attachFragment(FragmentManager.java:1430)
                                                                         at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:728)
                                                                         at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1617)
                                                                         at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:570)
                                                                         at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
                                                                         at android.support.v4.view.ViewPager.populate(ViewPager.java:1177)
                                                                         at android.support.v4.view.ViewPager.populate(ViewPager.java:1025)
                                                                         at android.support.v4.view.ViewPager$3.run(ViewPager.java:254)
                                                                         at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858)
                                                                         at android.view.Choreographer.doCallbacks(Choreographer.java:670)
                                                                         at android.view.Choreographer.doFrame(Choreographer.java:603)
                                                                         at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)
                                                                         at android.os.Handler.handleCallback(Handler.java:746)
                                                                         at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                         at android.os.Looper.loop(Looper.java:148)
                                                                         at android.app.ActivityThread.main(ActivityThread.java:5443)
                                                                         at java.lang.reflect.Method.invoke(Native Method)
                                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
                                                                        at com.andr
halfer
  • 19,824
  • 17
  • 99
  • 186
MrG
  • 169
  • 2
  • 6
  • 19

3 Answers3

2

Convert your Images in WEbp format

Click Here for WEbp Format

add to your Menifest This is Temporary Solution

<application
   ........................
   android:largeHeap="true"> 
Nikunj Paradva
  • 15,332
  • 5
  • 54
  • 65
1

Optimize your images (which in your logoIds list) with one of available solutions, such as

This or just reExport in right way from your PhotoShop(or whatever you use).

And another AND RIGHT way is to generate diffrent icons for diffrent dpi(see tools)

And i strongly recommend you to use Glide or Picasso to load images inside lists, cause they have build-in caching which is good for recycled views

UPD: sample of use Glide to load resources

Glide.with(convertView.getContext())
.load(R.id.resource_id)
.into(imageView);

And use ViewHolder pattern in your adapter, to avoid rebinding views on recycling (gridView.findViewById(R.id.logoImageView))

Hank Moody
  • 354
  • 2
  • 15
1

Add this to your AndroidManifest.xml file. Inside application tag.

<application
    ....
       android:largeHeap="true"> 

check this details

Amit Vaghela
  • 22,772
  • 22
  • 86
  • 142
  • @MrG But note, that this solution(i mean `largeHeap="true"`) is only makes your app to have a bit large RAM memory space, but it's not solution for your problem – Hank Moody Oct 05 '17 at 09:43
  • @AmitVaghela while this may work, allocating too much RAM over a short period of time is denied by the system. Even with largeHeap, allocating a lot of images over a too short period of time will throw an OOME. And even largeHeap has its limitations. The best way to solve the OOME is to use largeHeap **in combination with** either a library (like picasso) or resizing the images. – Zoe Oct 05 '17 at 09:55
  • @AmitVaghela I downvoted because the majority of the answer is in the target link. Links can die – Zoe Oct 05 '17 at 10:18
  • @Zoe hey man, this is a protected question it can not be deleted that easily and plus it is a stackoverflow link. all answer has descriptions. – Amit Vaghela Oct 05 '17 at 10:23
  • @AmitVaghela the same rules apply. Just because it's on SO doesn't mean it's except from the link rules – Zoe Oct 05 '17 at 10:45
  • @AmitVaghela can you comment on this https://stackoverflow.com/questions/46569833/android-recyclerview-horizontal-and-vertical-spacing – MrG Oct 05 '17 at 17:47