1

Good evening,

      In creating my first real personal project I have 5 fragments each containing a TabLayout with 2/3 fragments. Each has a GridView about 50 images (see 200 for some). But when I switch between Fragments I quickly reaches a OutMemory. I am in the phase of creating / testing and I use 8 Drawable present in the application (400px * 250px size, size: between 40kB and 200kB ).

The cons, the memory space used when using, the first pick is the launch dice (8 images) and each subsequent pick represents the opening of a fragment containing a TabLayout. Up to 30 sec or I return to the first fragment.

enter image description here

Creating TabLayout in Fragments :

private void setupViewPager(ViewPager viewPager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getActivity().getSupportFragmentManager());
 
        FragmentList fla = FragmentList.newInstance("ONE", ContextCompat.getColor(getContext(), R.color.w_blue_grey_40));
        adapter.addFragment(fla, "ONE");
        fla = FragmentList.newInstance("TWO", ContextCompat.getColor(getContext(), R.color.w_blue_grey_40));
        adapter.addFragment(fla, "TWO");
 
        viewPager.setAdapter(adapter);
    }
 
    class ViewPagerAdapter extends <strong>FragmentStatePagerAdapter</strong> {
 
        private final List<FragmentList> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitleList = new ArrayList<>();
 
        public ViewPagerAdapter(FragmentManager manager) {
            super(manager);
        }
 
        @Override
        public Fragment getItem(int position) {
            return mFragmentList.get(position);
        }
 
        @Override
        public int getCount() {
            return mFragmentList.size();
        }
 
        public void addFragment(FragmentList fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }
 
        @Override
        public CharSequence getPageTitle(int position) {
            return mFragmentTitleList.get(position);
        }
    }

I use Picasso et Pattern Holder in my GridViewAdapter :

@Override
public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
 
        TestHolder holder = null;
 
        if (row == null) {
            LayoutInflater mInflater = (LayoutInflater)
                    context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            row = mInflater.inflate(R.layout.card_test, null);
 
            holder = new TestHolder();
            holder.test_image = (ImageView) row.findViewById(R.id.test_image);
            row.setTag(holder);
        } else {
            holder = (TestHolder) row.getTag();
        }
 
        Test test = data.get(position);
           Picasso.with(context).load(test.getImage()).into(holder.test_image);
         
        return row;
    }
 
    class TestHolder {
        ImageView test_image;
    }

Thx all for your answers.

GJer
  • 85
  • 1
  • 10

1 Answers1

1

Out of memory is an interesting problem. I suggest view solutions to try :

  1. Set the offscreen page limit to 1. So it will only save 1 fragment at a time in memory

    viewpager.setOffscreenPageLimit(1).
    
  2. In each of fragment, try using RecyclerView with GridLayout as LayoutManager. RecyclerView is a great tools to save us from out of memory

  3. Try to replace Picasso with Glide for image loader. Maybe out of memory happen because the image is actually too large. Glide is the best image loader library in memory management (I think).

Faruk
  • 5,438
  • 3
  • 30
  • 46
  • 1
    The mere use of Glide solves the memory problem. Nevertheless, I used a RecyclerView with GridLayoutManager but the scroll is not fluid, it is only the position of the finger on the screen and stop on. – GJer Jun 23 '16 at 09:09