【发布时间】:2019-08-03 12:47:45
【问题描述】:
我刚刚将 CanaryLeak 添加到我的项目中,以查看我的应用程序中是否存在任何内存泄漏并注意到,由于 Snackbar,我的片段中确实存在泄漏。
我正在 onCreateView 中创建一个 Snackbar,并将其设置为 onDestroyView 中的 null。但是,每次旋转屏幕时都会发生内存泄漏。
@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;
}
当我清除对操作和 Snackbar 本身的引用时,应该没有任何原因导致内存泄漏。但是我无法弄清楚,原因可能是什么,Canary Leak 的堆转储也无济于事。 由于对 nav_host_fragment 的引用,我怀疑它可能是我的,但我不知道它是否属实以及如何解决它。
非常感谢您的帮助。
编辑 1:
添加了泄漏跟踪并删除了 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
【问题讨论】:
标签: android memory-leaks leakcanary