美文网首页
一次榜单页 viewpager 内存泄漏的解决

一次榜单页 viewpager 内存泄漏的解决

作者: couriravant | 来源:发表于2020-03-22 23:24 被阅读0次

修改前代码:
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

相关文章

网友评论

      本文标题:一次榜单页 viewpager 内存泄漏的解决

      本文链接:https://www.haomeiwen.com/subject/puwbyhtx.html