如何防止Fragment泄漏

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

我有以下活动:

class SwitchFragAct extends AppCompatActivity {
  Fragment a;
  Fragment b;

  onClickSwitchFrags(View v) {
    FragmentManager mgr = getSupportFragmentManager();
    Fragment currentFrag = mgr.findFragmentById(R.id.frag_to_swap);
    
    if (currentFrag == a) {
       mgr.beginTransaction().detach(a).attach(b).commit();
    } else if (currentFrag == b) {
       mgr.beginTransaction().detach(b).attach(a).commit();
    }
  }
}

因此泄漏金丝雀会抱怨未附加的片段正在泄漏(例如@SwitchFragAct#a)。我有什么办法可以确保它不泄漏?我想我需要使用附加/分离,以便状态仍然被保存。我认为唯一的选择是每次都重新创建片段。目前,在该片段中没有任何机制可以执行此操作,我可以在其中传递保存的状态。

android android-fragments leakcanary android-memory android-fragment-manager
1个回答
0
投票

为了防止

SwitchFragAct
类中的片段泄漏,您可以考虑使用
replace
方法而不是
detach
attach
replace
方法删除当前片段并在其位置添加一个新片段。这可确保前一个片段被正确销毁并避免任何潜在的内存泄漏。

class SwitchFragAct extends AppCompatActivity {
  Fragment a;
  Fragment b;

  onClickSwitchFrags(View v) {
    FragmentManager mgr = getSupportFragmentManager();
    Fragment currentFrag = mgr.findFragmentById(R.id.frag_to_swap);
    
    if (currentFrag == a) {
       mgr.beginTransaction().replace(R.id.frag_to_swap, b).commit();
    } else if (currentFrag == b) {
       mgr.beginTransaction().replace(R.id.frag_to_swap, a).commit();
    }
  }
}

在此代码中,

replace
方法用于将当前片段(
currentFrag
)替换为所需片段(
a
b
)。通过这样做,前一个片段将被正确销毁,并将新片段添加到其位置,从而避免任何潜在的内存泄漏。

请注意,您需要将

R.id.frag_to_swap
替换为放置片段的容器的实际 ID。

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