所以我有一个带有View Pager的MainActivity。我为View Pager创建了一个非静态自定义FragmentPageAdapter,如下所示:
public class CustomViewPageAdapter extends FragmentStatePagerAdapter {
适配器有4个项目(片段)我将其声明为全局变量MainActivity为静态,例如:
static HotFragment hotFragment;
然后我在FragmentStatePagerAdapter的getItem()方法中返回hotFragment。
然后在我的HotFragment类中,我有另一个ViewPager以及另一个非静态的FragmentStatePagerAdapter:在该Adapter的getItem()方法中,返回另一个名为ImageDetailFragment的片段的新实例,如下所示:
return ImageDetailFragment.newInstance(arg0);
ImageDetailFragment包含一个ImageView,它将根据arg0的值保存不同的图像。 ImageView加载在MainActivity中的AsyncTask中。异步将WeakReference保存到ImageView以确保它是垃圾收集。
我的问题是: 当我滚动图像时,我经常会出现OutOfMemory错误,特别是当我退出活动然后重新进入活动时。我对内存管理和垃圾收集很新,但我想我在某处有内存泄漏。然而,这不是一个模糊的问题。我想知道的是: 我是否应该使我的hotFragment静态,因为我知道静态对象可能导致内存泄漏。 也。我的FragmentStatePagerAdapters是非静态的,这很糟糕。所有适配器都应该是片段中的静态。 另一件事。在我的HotFragment中的FragmentPagerAdapter中的getItem(id)方法中,我返回:
ImageDetailFragment.newInstance();
而不是在实际的HotFragment中创建ImageDetailFragment的实例。这不好吗?因为在我的MainActivity中,我没有返回hotFragment,就像我在MainActivity中创建hotFragment的静态实例一样,然后返回它。哪一个更好。
如果你们帮助我,我真的很感激。我是内存管理的新手,并且不确定避免内存泄漏的最佳实践是什么。如果我的问题太长或太模糊,我很抱歉。我真的试图让它尽可能具有描述性......谢谢
答案 0 :(得分:1)
如果您确定内存中有大量静态片段会消耗大量内存,那么您可以尝试这样的事情:
而不是使用:
@Override
public Fragment getItem(int position) {
// getItem is called to instantiate the fragment for the given page.
// Return a PlaceholderFragment (defined as a static inner class below).
return PlaceholderFragment.newInstance(position);
}
你实际上可以声明一个片段的地图。主要目标是重复使用以前创建的片段,而不是继续声明新实例。首先,在片段活动中声明此代码(不在SectionsPagerAdapter中):
private Map<Integer, PlaceholderFragment> mPlaceHolderFragmentArray = new LinkedHashMap<Integer, PlaceholderFragment>();
然后用SeptsPagerAdapter替换 getItem(int position)方法:
@Override
public Fragment getItem(int position) {
// getItem is called to instantiate the fragment for the given page.
// Return a PlaceholderFragment (defined as a static inner class below).
PlaceholderFragment fragment = mPlaceHolderFragmentArray.get(position);
if(fragment == null){
fragment = PlaceholderFragment.newInstance(position);
mPlaceHolderFragmentArray.put(position, fragment);
}
return fragment;
}
我不知道是否有更好的方法,但我目前正在使用我的代码。