首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对话片段数据绑定泄漏存储器

对话片段数据绑定泄漏存储器
EN

Stack Overflow用户
提问于 2022-10-26 04:49:22
回答 1查看 40关注 0票数 0

尽管我已经在覆盖binding = null中设置了onDestroyView,但我的对话框片段仍使内存泄漏。这是我的onCreateView和onDestroyView:

代码语言:javascript
运行
复制
@AndroidEntryPoint
class AddressDialogFragment : BottomSheetDialogFragment() {

    private var binding: FragmentAddressDialogBinding? = null
    private val viewModel: AddressViewModel by activityViewModels()

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        binding =
            DataBindingUtil.inflate(inflater, R.layout.fragment_address_dialog, container, false)
        binding?.viewModel = viewModel
        binding?.lifecycleOwner = this.viewLifecycleOwner
        // doing my things
        val view =  binding?.root
        return view!!
    }
}
代码语言:javascript
运行
复制
override fun onDestroyView() {
    binding = null
    super.onDestroyView()
}

我使用导航组件导航到这个DiaLogFragment,但不认为这是个问题。我使用过binding.unbind(),或者dismiss(),DialogFragmet,但是它没有用。我还检查了DialogFragment是否已经调用了onDestroyView和onDestroy。

这是我从LeakCanary获得的泄漏(1次打开并关闭对话框时的2次泄漏,但只有1次不同的泄漏):

代码语言:javascript
运行
复制
│ GC Root: System class
│
├─ android.view.accessibility.AccessibilityManager class
│    Leaking: NO (a class is never leaking)
│    ↓ static AccessibilityManager.sInstance
│                                  ~~~~~~~~~
├─ android.view.accessibility.AccessibilityManager instance
│    Leaking: UNKNOWN
│    Retaining 374.7 kB in 8787 objects
│    ↓ AccessibilityManager.mTouchExplorationStateChangeListeners
│                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
├─ android.util.ArrayMap instance
│    Leaking: UNKNOWN
│    Retaining 374.4 kB in 8775 objects
│    ↓ ArrayMap.mArray
│               ~~~~~~
├─ java.lang.Object[] array
│    Leaking: UNKNOWN
│    Retaining 374.4 kB in 8773 objects
│    ↓ Object[0]
│            ~~~
├─ com.google.android.material.textfield.DropdownMenuEndIconDelegate$7 instance
│    Leaking: UNKNOWN
│    Retaining 14.9 kB in 264 objects
│    Anonymous class implementing android.view.accessibility.AccessibilityManager$TouchExplorationStateChangeListener
│    ↓ DropdownMenuEndIconDelegate$7.this$0
│                                    ~~~~~~
├─ com.google.android.material.textfield.DropdownMenuEndIconDelegate instance
│    Leaking: UNKNOWN
│    Retaining 14.9 kB in 263 objects
│    context instance of androidx.appcompat.view.ContextThemeWrapper, wrapping activity com.example.aposs_buyer.
│    uicontroler.activity.AddressActivity with mDestroyed = false
│    ↓ EndIconDelegate.textInputLayout
│                      ~~~~~~~~~~~~~~~
├─ com.google.android.material.textfield.TextInputLayout instance
│    Leaking: YES (View detached yet still part of window view hierarchy)
│    Retaining 12.4 kB in 298 objects
│    View is part of a window view hierarchy
│    View.mAttachInfo is null (view detached)
│    View.mWindowAttachCount = 1
│    mContext instance of androidx.appcompat.view.ContextThemeWrapper, wrapping activity com.example.aposs_buyer.
│    uicontroler.activity.AddressActivity with mDestroyed = false
│    ↓ View.mParent
├─ android.widget.LinearLayout instance
│    Leaking: YES (TextInputLayout↑ is leaking and View detached yet still part of window view hierarchy)
│    Retaining 157.8 kB in 3879 objects
│    View is part of a window view hierarchy
│    View.mAttachInfo is null (view detached)
│    View.mWindowAttachCount = 1
│    mContext instance of dagger.hilt.android.internal.managers.ViewComponentManager$FragmentContextWrapper, wrapping
│    activity com.example.aposs_buyer.uicontroler.activity.AddressActivity with mDestroyed = false
│    ↓ View.mParent
╰→ androidx.core.widget.NestedScrollView instance
Leaking: YES (ObjectWatcher was watching this because com.example.aposs_buyer.uicontroler.fragment.
AddressDialogFragment received Fragment#onDestroyView() callback (references to its views should be cleared to
prevent leaks) and View detached yet still part of window view hierarchy)
Retaining 39.2 kB in 782 objects
key = 3588963a-7778-4442-ac60-a99f5380ede0
watchDurationMillis = 281964
retainedDurationMillis = 276959
View is part of a window view hierarchy
View.mAttachInfo is null (view detached)
View.mWindowAttachCount = 1
mContext instance of dagger.hilt.android.internal.managers.ViewComponentManager$FragmentContextWrapper, wrapping
activity com.example.aposs_buyer.uicontroler.activity.AddressActivity with mDestroyed = false

我希望我能很快得到答案。我已经坚持这个漏洞两天了。

EN

回答 1

Stack Overflow用户

发布于 2022-10-27 09:24:25

我只知道这是材料设计库的TextInputLayout泄露。要修复它,我所需要做的就是更新材料设计,从1.6.0到1.7.0 implementation 'com.google.android.material:material:1.7.0',关联链接帮助我弄清楚它是在这里:https://github.com/material-components/material-components-android/issues/2615

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74202825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档