机器人。如何使用自定义ArrayAdapter和ViewPagers来节省内存

时间:2014-10-30 22:28:17

标签: android android-fragments memory-leaks android-viewpager out-of-memory

所以我有一个带有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的静态实例一样,然后返回它。哪一个更好。

如果你们帮助我,我真的很感激。我是内存管理的新手,并且不确定避免内存泄漏的最佳实践是什么。如果我的问题太长或太模糊,我很抱歉。我真的试图让它尽可能具有描述性......谢谢

1 个答案:

答案 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;
    }

我不知道是否有更好的方法,但我目前正在使用我的代码。