Android Fragments FragmentTransaction Android Studio期间的片段内存泄漏

nc1teljy  于 2023-03-08  发布在  Android
关注(0)|答案(1)|浏览(157)

我正在Android Studio中使用LeakCanary来监控移动应用中的内存泄漏。在一个使用两个Fragment执行FragmentTransaction操作的Activity中发现了这些内存泄漏。它们都是使用"new"关键字示例化的,并且在onCreate方法中使用了另一个方法"setFragment(fragment)"根据bottomNavigationMenu选择将每个片段作为参数传递。最后在setFragment内部(片段)方法正在使用"获取支持片段管理器().开始事务().替换(R. id. main_frame,片段).提交();"功能。
这是密码:

public class YouTubeActivity extends AppCompatActivity {

    private final NetworkFragment networkFragment = new NetworkFragment();
    private final MyListFragment myListFragment = new MyListFragment();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        setContentView(R.layout.activity_you_tube);

        BottomNavigationView bottomNavigationMenu = findViewById(R.id.bottomNavigationMenu);

        setFragment(networkFragment);
        bottomNavigationMenu.setSelectedItemId(R.id.search_YouTube);
        bottomNavigationMenu.setOnNavigationItemSelectedListener(item -> {
            if(item.isChecked())
                return true;
            else{
                if(item.getItemId() == R.id.search_YouTube){
                    setFragment(networkFragment);
                    return true;
                }else if(item.getItemId() == R.id.search_my_list){
                    setFragment(myListFragment);
                    return true;
                }else{
                    setFragment(networkFragment);
                    return true;
                }
            }
        });

        Objects.requireNonNull(getSupportActionBar()).setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
        getSupportActionBar().setCustomView(R.layout.custom_action_bar_3);
    }

    private void setFragment(Fragment fragment){
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.main_frame, fragment)
                .commit();
    }
}

我怎样才能使这个FragmentTransaction不泄漏内存?我读到了弱引用,它是一个选项吗?
提前感谢!

cidc1ykv

cidc1ykv1#

我设法消除了这些可怕的内存泄漏,只是通过移动NavigationItemSelectedListener内部的两个片段的示例化并删除setFragment(fragment)方法!
这个教程帮了我很大的忙:https://www.youtube.com/watch?v=tPV8xA7m-iw&ab_channel=CodinginFlow(这家伙真有才华!)

相关问题