Destroyed和Detached片段不是垃圾收集/仍然存在

时间:2015-07-30 16:38:20

标签: android garbage-collection android-viewpager out-of-memory fragmentstatepageradapter

我有一个片段,它托管一个由FragmentStatePager适配器填充的ViewPager。子片段包括一个方形ImageView,手机屏幕的宽度和显示用户名称的TextView。这个片段的目的是允许滑动一系列图片,类似于画廊应用程序,所有照片都由毕加索图书馆加载。

这些片段都没有私有的View变量,并且在弹出它们所在的backstack后调用了onDestroy和onDetach。然而,在使用Eclispe的MAT之后,这些片段仍然存在消耗内存,我不知道为什么。

PhotoParentFragment的字段仅由以下内容组成:

public class PhotoParentFragment extends BaseFragment
    implements ViewPager.OnPageChangeListener,
    Observer<Integer> {

public static final String TAG = PhotoParentFragment.class.getSimpleName();

private static final String PHOTO_LIST = "PHOTO_LIST";
private static final String CURRENT_PHOTO = "CURRENT_PHOTO";

private boolean isBucketListMenuAdded = false;

private static final int DELETE = 4;
private static final int ERROR = 5;

private int currentPhoto = 0;

private ArrayList<Photo> photos;

public static PhotoParentFragment newInstance(int sectionNumber, int currentPhoto,
                                             ArrayList<Photo> photos) {
    PhotoParentFragment fragment = new PhotoParentFragment();
    Bundle args = new Bundle();
    args.putInt(Utils.ARG_SECTION_NUMBER, sectionNumber);
    args.putInt(CURRENT_PHOTO, currentPhoto);
    args.putParcelableArrayList(PHOTO_LIST, photos);
    fragment.setArguments(args);
    return fragment;
}

PhotoChild片段的字段仅由以下内容组成:

public class PhotoChildFragment extends BaseFragment
    implements View.OnClickListener {

public static final String TAG = PhotoChildFragment.class.getSimpleName();

private static final String NUM_PHOTOS = "NUM_PHOTOS";
private static final String PHOTO = "PHOTO";

private int imageSize;

private int position;
private int numOfPhotos;
private Photo photo;
private boolean isPhotoOwner = false;

public static PhotoChildFragment newInstance(int position, int numPhotos, Photo photo) {
    PhotoChildFragment fragment = new PhotoChildFragment();
    Bundle args = new Bundle();
    args.putInt(Utils.ARG_SECTION_NUMBER, position);
    args.putInt(NUM_PHOTOS, numPhotos);
    args.putParcelable(PHOTO, photo);
    fragment.setArguments(args);
    return fragment;
}

在父级的onCreateView中,我以这种方式设置了ViewPager:

 final PhotoPagerAdapter photoPagerAdapter = new PhotoPagerAdapter(getChildFragmentManager(), photos.size());
    final ViewPager viewPager = (ViewPager) rootView.findViewById(R.id.pager);

    photoPagerAdapter.setPhotos(photos);
    viewPager.addOnPageChangeListener(this);
    viewPager.setAdapter(photoPagerAdapter);
    viewPager.setCurrentItem(currentPhoto);

任何地方都没有静态引用。现在,当我从后面的堆栈中弹出片段时,尽管onDetach和onDestroy被调用所有片段的父节点和多个子节点,但片段仍然存在。调用getSupportFragmentManager.getFragments.size()也会显示父片段已消失。

然而,MAT说不然。我显示的屏幕截图是我单击列表中的照片并按下4次的结果:

忽略profilePhotoAdapter $ ViewHolder和UserListAdapter $ ViewHolder。它们来自不同的东西。

MAT Histogram

注意4个父片段是如何持续存在的,12个子片段(4 * 3)仍然存在。这让我很生气。将最短路径合并到GC根源会产生这种情况,这并非完全有用:

Merge shortest path to GC root

所以,如果有人经历过这个,请问您是如何解决的?

最后,父和子都将setOptionsMenu设为true。

0 个答案:

没有答案