修改前代码:
LeaderBoardActivity
@Override
public void showBoard(@NonNull LeaderBoardData boardData) {
ImageLoaderHelper.load(mTitleIv, boardData.titlePic.url);
mLeaderBoardData = boardData;
mTitleIv.setImageURI(boardData.titlePic.url);
List<Fragment> fragments = new ArrayList<>();
。。。
int n = boardData.itemList.size();
for (int i =0; i < n; i++) {
LeaderBoardFragment leaderBoardFragment = LeaderBoardFragment.newInstance(boardData.itemList.get(i), boardData.itemList.get(i).tabId, mType);
fragments.add(leaderBoardFragment);
}
mLeaderBoardViewPagerAdapter.setFragments(fragments);
}
viewpager配合fragment使用,当fragment较多时,滑动切换tab,fragment会被销毁,而在LeaderBoardActivity 中fragments 对各实例化的LeaderBoardFragment存在强引用,因此产生了内存泄漏,解决办法就是不再使用fragments存储fragment实例,把fragment的实例延后到mLeaderBoardViewPagerAdapter中去。修改后代码如下:
@Override
public void showBoard(@NonNull LeaderBoardData boardData) {
ImageLoaderHelper.load(mTitleIv, boardData.titlePic.url);
mLeaderBoardData = boardData;
mTitleIv.setImageURI(boardData.titlePic.url);
if (boardData.backgroundPic != null && !StringUtils.isEmpty(boardData.backgroundPic.url)) {
backgroundSv.setImageURI(boardData.backgroundPic.url);
}
//在此处只传递原始数据,不再传递实例后的fragment
mLeaderBoardViewPagerAdapter.setDatas(boardData.itemList, mType);
}
那么实例化放哪了呢?看下面:
LeaderBoardViewPagerAdapter:
@Override
public Fragment getItem(int position) {
// 在获取item时再实例化,这时用到了activity传过来的数据
return LeaderBoardFragment.newInstance(mBoardLists.get(position), mBoardLists.get(position).tabId, mBoardType);
}
@Override
public int getCount() {
return mBoardLists.size();
}
public void setDatas(List<LeaderBoardData.BoardList> boardLists, int boardType) {
mBoardLists.clear();
mBoardLists.addAll(boardLists);
mBoardType = boardType;
notifyDataSetChanged();
}
网上的解决办法,有在 getItem中用反射实例化的,感觉不太好,反射比较效率比较低,而且传参比较麻烦。
https://www.cnblogs.com/weimore/p/7466630.html
网友评论