避免android碎片内存泄漏的最佳方法是什么



我找到了很多方法来避免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.将所有子视图设置为null并删除视图

    @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();
        }
    }

将变量设置为null并不意味着它将获得GC'd。只有在任何地方都没有其他对它的强引用的情况下,它才会被GC选中。

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

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

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

相关内容

最新更新