我有一个片段,它托管一个由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。它们来自不同的东西。
注意4个父片段是如何持续存在的,12个子片段(4 * 3)仍然存在。这让我很生气。将最短路径合并到GC根源会产生这种情况,这并非完全有用:
所以,如果有人经历过这个,请问您是如何解决的?
最后,父和子都将setOptionsMenu设为true。