2016-03-09 67 views
2
public class GenericRetainedFragment extends GenericFragment { 

    @Bind(R.id.some_button) 
    Button button; 

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

    @Override 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
     ButterKnife.bind(this, view); 
    } 

    @Override 
    public void onDestroyView() { 
     super.onDestroyView(); 
     ButterKnife.unbind(this); 
    } 
} 

因为我不知道ButterKnife是如何工作在解除绑定方法上的,因此配置更改会导致内存泄漏?ButterKnife内存安全保留碎片吗?

这是使用ButterKnife和Retained Fragment的良好做法吗?

回答

1

我没有看到保留片段会有任何问题,因为片段的实例在删除之前应始终保持“活动状态”。它不会进入后端堆栈,因此它的视图被破坏并可能被重新创建(这是碎片需要使用ButterKnife的特殊模式的正常情况)。保留片段的一个实例只有一组视图,除非您做了一些更改。

+0

当我们调用'ButterKnife.bind(this)'时,ButterKnife是否会清除视图引用?如果是这样,那么活动就会被垃圾收集起来,不是吗? – dandoh

+0

是的,如果一个活动被销毁,那么它的所有组件也应该被销毁,除非你正在做一些事情来阻止它们超出活动的范围。 –