我正在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不泄漏内存?我读到了弱引用,它是一个选项吗?
提前感谢!
1条答案
按热度按时间cidc1ykv1#
我设法消除了这些可怕的内存泄漏,只是通过移动NavigationItemSelectedListener内部的两个片段的示例化并删除setFragment(fragment)方法!
这个教程帮了我很大的忙:https://www.youtube.com/watch?v=tPV8xA7m-iw&ab_channel=CodinginFlow(这家伙真有才华!)