2016-03-09 83 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

是的,如果一個活動被銷燬,那麼它的所有組件也應該被銷燬,除非你正在做一些事情來阻止它們超出活動的範圍。 –