片段 TabLayout / GridView OutMemory

Fragment TabLayout / GridView OutMemory

晚上好,

在创建我的第一个真正的个人项目时,我有 5 个片段,每个片段包含一个带有 2/3 片段的 TabLayout。每个都有一个大约 50 张图像的 GridView(有些是 200 张)。 但是当我在 Fragment 之间切换时,我很快就会遇到 OutMemory。 我正处于创建/测试阶段,我在应用程序中使用了 8 个 Drawable(400px * 250px 大小,大小:介于 40kB 和 200kB 之间)。

缺点,使用时占用内存space,第一个pick是launch dice(8张图片),后面的每个pick代表打开一个包含TabLayout的fragment。最多 30 秒或我 return 到第一个片段。

在片段中创建 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 中使用 Picasso 和 Pattern Holder :

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

谢谢大家的回答。

内存不足是一个有趣的问题。我建议尝试查看解决方案:

  1. 设置offscreen page limit为1。这样一次只会在内存中保存1个fragment

    viewpager.setOffscreenPageLimit(1).
    
  2. 在每个片段中,尝试使用 RecyclerView 和 GridLayout 作为 LayoutManager。 RecyclerView 是一个很好的工具,可以帮助我们避免内存不足

  3. 尝试将 Picasso 替换为 Glide 图像加载器。也许内存不足是因为图像实际上太大了。 Glide 是内存管理中最好的图像加载器库(我认为)。