Android ConstraintLayout删除后泄漏视图。还是我遗漏了什么?
我正在开发一个小型库,它可以动态(以编程方式)将视图添加到视图层次结构中。然后可以从父视图组中删除视图。我注意到,当我使用匹配父LayoutParams将视图添加到约束布局中,然后删除视图时,视图仍保留在内存中。FrameLayout或LinearLayout作为父视图组时不会发生这种情况。 我用泄漏金丝雀来探测泄漏。再现问题的代码(应在consraint布局作为根视图的片段中使用):Android ConstraintLayout删除后泄漏视图。还是我遗漏了什么?,android,memory-leaks,android-view,android-constraintlayout,leakcanary,Android,Memory Leaks,Android View,Android Constraintlayout,Leakcanary,我正在开发一个小型库,它可以动态(以编程方式)将视图添加到视图层次结构中。然后可以从父视图组中删除视图。我注意到,当我使用匹配父LayoutParams将视图添加到约束布局中,然后删除视图时,视图仍保留在内存中。FrameLayout或LinearLayout作为父视图组时不会发生这种情况。 我用泄漏金丝雀来探测泄漏。再现问题的代码(应在consraint布局作为根视图的片段中使用): private val views=mutableListOf() 趣味showDefaultView(){
private val views=mutableListOf()
趣味showDefaultView(){
重复(5){
val testView=View(requireContext())
val params=ViewGroup.layoutparms(
ViewGroup.LayoutParams.MATCH_父级,
ViewGroup.LayoutParams.MATCH_父级
)
(作为视图组查看)。添加视图(testView,参数)
添加(testView)
}
}
乐趣隐藏错误视图(){
views.foreachinedexed{index,testView->
AppWatcher.objectWatcher.watch(testView,“带索引的testView#$index”)
(作为视图组查看)。移除视图(testView)
}
视图。清除()
}
所以,问题来了。这是已知的bug吗?还是我错过了什么?如果这是一个已知的错误,是否有任何解决方法
Upd:我对此进行了一些调查。似乎问题出在coContrainLayout类内部。删除视图时,稀疏数组mTempMapIdToWidget不会从自身删除小部件(什么是“小部件”?我不知道)。请提供LeakCanary的泄漏跟踪,否则人们无法帮助您:)请提供LeakCanary的泄漏跟踪,否则人们无法帮助您:)
private val views = mutableListOf<View>()
fun showDefaultView() {
repeat(5) {
val testView = View(requireContext())
val params = ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT
)
(view as ViewGroup).addView(testView, params)
views.add(testView)
}
}
fun hideDefaultViews() {
views.forEachIndexed { index, testView ->
AppWatcher.objectWatcher.watch(testView, "testView witn index#$index")
(view as ViewGroup).removeView(testView)
}
views.clear()
}