1

Добрый вечер,Фрагмент TabLayout/GridView OutMemory

При создании мой первый реальный личный проект у меня есть 5 фрагментов, каждый содержащий TabLayout с 2/3 фрагментов. Каждый из них имеет GridView около 50 изображений (см. 200 для некоторых). Но когда я переключаюсь между фрагментами, я быстро добираюсь до OutMemory. Я нахожусь в фазе создания/тестирования, и я использую 8 Drawable, присутствующих в приложении (размер 400px * 250px, размер: от 40 до 200 КБ).

Против, пространство памяти, используемое при использовании, первый выбор - это запускаемые кости (8 изображений), и каждый последующий выбор представляет собой открытие фрагмента, содержащего TabLayout. До 30 секунд или я возвращаюсь к первому фрагменту.

enter image description here

Создание TabLayout в фрагментах:

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); 
 
        } 
 
    }

Я использую Пикассо ЕТ шаблон держатель в моем 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 все для ваших ответов.

+0

попробовать этот ответ ... http://stackoverflow.com/a/31260418/3678308 –

+0

* 400px * 250px размер, размер: 40Kb между и 200Кб * нет, размер для заданной ширины и высоты для Const drawable и это 400kB – Selvin

ответ

1

Недостаточно памяти - проблема. Я предлагаю просмотреть решения попробовать:

  1. Установите закадровый предел страницы на 1. Таким образом, он будет сохранять только 1 фрагмент в то время в память

    viewpager.setOffscreenPageLimit(1). 
    
  2. В каждом фрагменте, попробуйте использовать RecyclerView с GridLayout как LayoutManager. RecyclerView - отличный инструмент для спасения нас из-за нехватки памяти.

  3. Попробуйте заменить Picasso Glide для загрузки изображений. Возможно, из-за недостатка памяти, потому что изображение на самом деле слишком велико. Glide - лучшая библиотека загрузчика изображений в управлении памятью (я думаю).

+1

Простое использование Glide решает проблему с памятью. Тем не менее, я использовал RecyclerView с GridLayoutManager, но свиток не является текучим, это только положение пальца на экране и остановка. – GJer