片段 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;
}
谢谢大家的回答。
内存不足是一个有趣的问题。我建议尝试查看解决方案:
设置offscreen page limit为1。这样一次只会在内存中保存1个fragment
viewpager.setOffscreenPageLimit(1).
在每个片段中,尝试使用 RecyclerView 和 GridLayout 作为 LayoutManager。 RecyclerView 是一个很好的工具,可以帮助我们避免内存不足
尝试将 Picasso 替换为 Glide 图像加载器。也许内存不足是因为图像实际上太大了。 Glide 是内存管理中最好的图像加载器库(我认为)。
晚上好,
在创建我的第一个真正的个人项目时,我有 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;
}
谢谢大家的回答。
内存不足是一个有趣的问题。我建议尝试查看解决方案:
设置offscreen page limit为1。这样一次只会在内存中保存1个fragment
viewpager.setOffscreenPageLimit(1).
在每个片段中,尝试使用 RecyclerView 和 GridLayout 作为 LayoutManager。 RecyclerView 是一个很好的工具,可以帮助我们避免内存不足
尝试将 Picasso 替换为 Glide 图像加载器。也许内存不足是因为图像实际上太大了。 Glide 是内存管理中最好的图像加载器库(我认为)。