Max*_*her 3 android memory-leaks leakcanary
我刚刚将 CanaryLeak 添加到我的项目中,以查看我的应用程序中是否存在任何内存泄漏,并注意到,由于 Snackbar,我的片段中确实存在泄漏。
我正在创建一个 SnackbaronCreateView并将其设置为nullin onDestroyView。但是,每次旋转屏幕时都会出现内存泄漏。
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup
container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_backend, container,
false);
Activity parentActivity = getActivity();
if (parentActivity != null) {
mConnectSnackbar =
Snackbar.make(parentActivity.findViewById(R.id.nav_host_fragment),
"Connect", Snackbar.LENGTH_INDEFINITE);
mConnectSnackbar.setAction(getString(R.string.connect), v ->
startActivity(new Intent(Settings.ACTION_WIRELESS_SETTINGS)));
}
return view;
}
@Override
public void onDestroyView() {
super.onDestroyView();
mConnectSnackbar.setAction("Connect", null);
mConnectSnackbar.dismiss();
mConnectSnackbar = null;
}
Run Code Online (Sandbox Code Playgroud)
当我清除对操作和 Snackbar 本身的引用时,不应该有任何内存泄漏的原因。但是我不知道可能是什么原因,来自 Canary Leak 的 Heap Dump 也无济于事。由于对 nav_host_fragment 的引用,我怀疑这可能是我,但我不知道它是否属实以及如何修复它。
非常感谢您的帮助。
添加了泄漏跟踪并删除了 hprof 文件。
?
?? android.view.accessibility.AccessibilityManager
? Leaking: NO (a class is never leaking)
? GC Root: System class
? ? static AccessibilityManager.sInstance
? ~~~~~~~~~
?? android.view.accessibility.AccessibilityManager
? Leaking: UNKNOWN
? ? AccessibilityManager.mTouchExplorationStateChangeListeners
? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
?? android.util.ArrayMap
? Leaking: UNKNOWN
? ? ArrayMap.mArray
? ~~~~~~
?? java.lang.Object[]
? Leaking: UNKNOWN
? ? array Object[].[4]
? ~~~
?? androidx.core.view.accessibility.AccessibilityManagerCompat$TouchExplorationStateChangeListenerWrapper
? Leaking: UNKNOWN
? ? AccessibilityManagerCompat$TouchExplorationStateChangeListenerWrapper.mListener
? ~~~~~~~~~
?? com.google.android.material.snackbar.BaseTransientBottomBar$SnackbarBaseLayout$1
? Leaking: UNKNOWN
? ? BaseTransientBottomBar$SnackbarBaseLayout$1.this$0
? ~~~~~~
?? com.google.android.material.snackbar.Snackbar$SnackbarLayout
? Leaking: YES (View.mContext references a destroyed activity)
? mContext instance of android.view.ContextThemeWrapper, wrapping activity com.twaice.twaice.MainActivity with mDestroyed = true
? View#mParent is null
? View#mAttachInfo is null (view detached)
? View.mWindowAttachCount = 0
Run Code Online (Sandbox Code Playgroud)
这是 material-components-android 库中的内存泄漏。我刚刚提交了一个问题:https : //github.com/material-components/material-components-android/issues/497
仅当创建了小吃店但从未按照问题中的描述显示时才会发生此泄漏:
在 Material Library 1.0.0 中,当创建 BaseTransientBottomBar .SnackbarBaseLayout 实例时,它注册一个 TouchExplorationStateChangeListener,然后注销 onDetachedFromWindow()。如果 SnackbarBaseLayout 已创建但从未附加(发生这种情况),则它永远不会分离。当底层上下文(一个活动)被破坏时,TouchExplorationStateChangeListener 由 AccessibilityManager 保存在内存中,保持其外部类 SnackbarBaseLayout ,该类本身保持其上下文,一个被破坏的活动。SnackbarBaseLayout 有效地泄漏了被破坏的活动和整个视图层次结构。
好消息是此代码在 1.1.0 版本中不再存在,因此泄漏消失了,尽管不幸的是 1.1.0 仍处于 alpha 版本。
注意:在以后的帖子中,考虑提供 LeakCanary 输出的文本泄漏跟踪,这对于解决内存泄漏很有用。
| 归档时间: |
|
| 查看次数: |
876 次 |
| 最近记录: |