我是否必須像使用系結一樣釋放我的自定義 ArrayAdapters 片段?還有ArrayList那保存資料的呢?
在我的Fragment課堂上,我有:
private var binding: FragmentUhfReadBinding? = null // init onCreateView, free onDestroyView, use onViewCreated
private var listAdapter: ReadUhfTagInfoItemViewAdapter? = null // init in onViewCreated
private val arrayList: ArrayList<ReadUhfTagInfo?>? = ArrayList()
override fun onCreateView(inflater: LayoutInflater,
container: ViewGroup?, savedInstanceState: Bundle?): View? {
binding = FragmentUhfReadBinding.inflate(inflater, container, false)
return binding!!.root
}
override fun onDestroyView() {
super.onDestroyView()
binding = null
// do I have to set `listAdapter` to null here?
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
listAdapter = ReadUhfTagInfoItemViewAdapter(this.context, arrayList)
binding!!.lvData.adapter = listAdapter
}
uj5u.com熱心網友回復:
是的,因為您的配接器正在參考一個背景關系(即附加的 Activity)。
它還參考了您僅在 Fragment 中創建的串列,但是您是否應該關心它是否泄露是值得商榷的。支持串列資料在 ViewModel 中更為典型,因此它可以被重用,在這種情況下,您的配接器持有的這個串列參考不會有問題。
盡管您的示例沒有顯示它,但配接器公開某種偵聽器以進行視圖互動也很常見。因此,當您添加它,并且您的偵聽器捕獲對片段中其他內容的參考時,配接器也會泄漏這些內容的記憶體。
但是,首先需要系結和配接器在類屬性中并不常見。如果您只在onViewCreated()和 呼叫的函式中使用它們onViewCreated(),那么您無需擔心清除對它們的參考,并且您不會有丑陋的使用!!,因此它會更加健壯。
您可以將布局 id 傳遞給超級建構式,而不是使用 膨脹視圖,onCreateView()然后通過呼叫.bindonCreateView()
class MyFragment: Fragment(R.layout.fragment_uhf_read) {
private val arrayList: ArrayList<ReadUhfTagInfo?> = ArrayList()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val binding = FragmentUhfReadBinding.bind(view)
val listAdapter = ReadUhfTagInfoItemViewAdapter(this.context, arrayList)
binding.lvData.adapter = listAdapter
// ... other code using binding and listAdapter
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/514407.html
標籤:安卓科特林生命周期
上一篇:自定義通知視圖不顯示影像
