1

我正在尝试创建一些相册应用程序。但是在创建新的 Fragment 时,旧的 Fragment 会留下来,并且它包含的 Bitmaps 会迅速填满我的内存,从而导致内存不足错误。

这是我正在尝试做的事情:

假设我有 3 个类别。婚纱照、暑假等。单击每个类别后,我想在其旁边的片段中显示照片。

对于主视图,我使用 MasterDetailFlow 模板中的 FragmentActivity(当您在 Eclipse 中创建新的 Android 项目时)。所以基本上它有一个带有 listView 的片段(这里是我的类别)和 framelayout 来放置我的另一个片段。

因为我想为图片创建 ViewPager,所以我创建了 Fragment

android.support.v4.view.ViewPager

在框架布局内(在 Activity onItemSelected :) 中:

fragment = new PagerFragment();
fragment.setArguments(arguments);
getSupportFragmentManager().beginTransaction()
     .replace(R.id.item_detail_container, fragment).commit();

这个片段基本上只是用来设置:

onCreateView ....
rootView = inflater.inflate(R.layout.pager, container, false);

    myFragmentStatePagerAdapter = new MyFragmentStatePagerAdapter(
            getActivity().getSupportFragmentManager(), pictures);
    mViewPager = (ViewPager) rootView.findViewById(R.id.pager);
    mViewPager.setAdapter(myFragmentStatePagerAdapter);

    return rootView;

另一方面,适配器在 getItem 方法中创建新的 PictureFragment。

PictureFragment 使用 BitmapFactory 和 LruCache 来获取图片。我将 WeakReference 存储到 PictureFragment 和 onDestroyView() 中的位图我调用:

if (bitmapReference !=null){
        bitmapReference.get().recycle();
        bitmapReference = null;
    }

现在来解决问题。在一个 PagerFragment 中看起来一切正常。图片片段被创建和销毁。记忆似乎得到了控制。但是当我单击其他列表元素上的活动时,问题就开始了。我可以在日志中看到正在为 pager View 创建两个新片段,我可以看到在 PagerFragment 上调用了 onDestroyView() 方法,但在 PictureFragment 上没有调用方法,我认为这会导致位图未被回收。因此内存不足错误。那么我做错了什么?如何去除里面的PicturesFragment和位图?

感谢帮助

W

4

1 回答 1

0

不确定这是否是同一个问题,但前段时间我遇到了 viewpager 的问题,其中片段生命周期方法从未被调用,而问题出在片段管理器上。

因此,当您在以下位置创建适配器时:

myFragmentStatePagerAdapter = new MyFragmentStatePagerAdapter(
        getActivity().getSupportFragmentManager(), pictures);

尝试使用 childFragmentManager 而不是 supportFragmentManager 并查看它是否可以解决您的问题。

于 2013-02-28T00:07:51.440 回答