我在 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?我读到了弱引用,这是一个选项吗?
非常感谢!
我通过将两个片段的实例化移动到 NavigationItemSelectedListener 中并删除 setFragment(fragment) 方法,设法摆脱了那些可怕的内存泄漏!
本教程对我帮助很大: https://www.youtube.com/watch?v=tPV8xA7m-iw&ab_channel=CodinginFlow(这家伙真有才!)