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

问题描述 投票:0回答:1

我在 Android Studio 中使用 LeakCanary 来监控我的移动应用程序中的内存泄漏。它们是在一个使用两个 Fragment 进行 FragmentTransaction 操作的活动中发现的。它们都使用“new”关键字实例化,在 onCreate 方法中使用另一种方法“setFragment(fragment)”,根据 bottomNavigationMenu 选择将每个 Fragment 作为参数传递。 最后在 setFragment(fragment) 方法中使用了“getSupportFragmentManager().beginTransaction().replace(R.id.main_frame, fragment).commit();”功能。

这是代码:

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?我读到了弱引用,这是一个选项吗?

非常感谢!

android-fragments memory-leaks weak-references fragmenttransaction leakcanary
1个回答
0
投票

我通过将两个片段的实例化移动到 NavigationItemSelectedListener 中并删除 setFragment(fragment) 方法,设法摆脱了那些可怕的内存泄漏!

本教程对我帮助很大: https://www.youtube.com/watch?v=tPV8xA7m-iw&ab_channel=CodinginFlow(这家伙真有才!)

© www.soinside.com 2019 - 2024. All rights reserved.