【问题标题】:What is the best way to avoid memory leaks in android fragment避免android片段中内存泄漏的最佳方法是什么
【发布时间】:2015-05-04 05:53:33
【问题描述】:

我找到了很多方法来避免 android 片段中的内存泄漏,但哪种方法是最好的呢?

1.调用onDestroyView时设置视图为null

public class LeakyFragment extends Fragment{

    private View mLeak; // retained

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        mLeak = inflater.inflate(R.layout.whatever, container, false);
        return mLeak;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        mLeak = null; // now cleaning up!
    }
}

2.设置所有子view=null并移除view

    @Override
    public void onDestroyView(){
        super.onDestroyView();
        unbindDrawables(mLeak);
    }

    private void unbindDrawables(View view){
        if (view.getBackground() != null){
            view.getBackground().setCallback(null);
        }
        if (view instanceof ViewGroup && !(view instanceof AdapterView)){
            for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++){
                unbindDrawables(((ViewGroup) view).getChildAt(i));
            }
            ((ViewGroup) view).removeAllViews();
        }
    }

【问题讨论】:

标签: android memory-leaks fragment


【解决方案1】:

将变量设置为null 并不意味着它会被GC'd。只有在任何地方都没有其他强引用时,它才会被 GC。

设置setRetainInstance(true) 本身不会使您的Fragment 泄漏,它只是在配置更改时保留Fragment 的该实例。它可能被认为是“有意识的泄漏”,因为您告诉框架您希望在当前 Activity 的生命周期之后保留 Fragment 对象。

现在Fragment 将泄露您的Activity,如果它不是无 UI 的Fragment。发生这种情况是因为具有 UI 的Fragments 将持有对 UI 组件的引用(即TextViewsEditTexts 等),而这些Views 持有对ActivityContext 的引用。为了避免这种情况,您需要将所有这些引用设置为null

此外,您可能还需要从其父级中删除 mLeak

【讨论】:

  • 有什么样本可以避免内存泄漏吗?当我在 FragmentTabHost 中更改片段时,调用 setContentView 时内存不足。
  • 您可能正在尝试加载需要太多内存的图像。您是否将可绘制对象设置为 ImageView
  • 不要使用 setRetainInstance。
  • 你需要说出你可以用这个布局做什么。然后我们可以帮助您。
  • 他为什么不能使用setRetainInsance()@PedroPauloAmorim?
猜你喜欢
  • 2010-12-23
  • 1970-01-01
  • 1970-01-01
  • 2022-10-20
  • 1970-01-01
  • 2017-05-16
  • 2022-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多