我对 LeakCanary 的行为有点困惑,我希望 SO 可以帮助我解决这个问题。我已将 LeakCanary 添加到我的应用程序,并且我看到一个弹出窗口声称存在泄漏。
这肯定看起来像这里提到的 InputMethodManager:https://github.com/square/leakcanary/issues/322
看起来 LeakCanary 将其标记为已排除,但仍显示弹出窗口。有什么我不明白的吗? (如果有帮助,我可以包括我的排除代码,但是......)
这是 Leak Activity 的屏幕截图:
这是修剪后的 logcat 输出:
12-13 15:08:26.868 D/LeakCanary( 1642): In com.blueapron.blueapron.debug:0.0.0-123-g5c653b9-debug:135000.
12-13 15:08:26.868 D/LeakCanary( 1642): * EXCLUDED LEAK.
12-13 15:08:26.868 D/LeakCanary( 1642): * com.blueapron.mobile.ui.MainActivity has leaked:
12-13 15:08:26.868 D/LeakCanary( 1642): * GC ROOT android.view.inputmethod.InputMethodManager$ControlledInputConnectionWrapper.mParentInputMethodManager , matching exclusion any subclass of android.view.inputmethod.InputMethodManager$ControlledInputConnectionWrapper
12-13 15:08:26.869 D/LeakCanary( 1642): * references android.view.inputmethod.InputMethodManager.mNextServedView , matching exclusion field android.view.inputmethod.InputMethodManager#mNextServedView
12-13 15:08:26.869 D/LeakCanary( 1642): * references android.support.v7.widget.RecyclerView.mContext
12-13 15:08:26.869 D/LeakCanary( 1642): * leaks com.blueapron.mobile.ui.MainActivity instance
12-13 15:08:26.869 D/LeakCanary( 1642): * Retaining: 6.0 KB.
12-13 15:08:26.869 D/LeakCanary( 1642): * Reference Key: ecc9f4d2-78a2-4542-ae1e-abb4d4e358e4
12-13 15:08:26.869 D/LeakCanary( 1642): * Device: motorola google Nexus 6 shamu
12-13 15:08:26.869 D/LeakCanary( 1642): * Android Version: 6.0.1 API: 23 LeakCanary: 1.5 00f37f5
12-13 15:08:26.869 D/LeakCanary( 1642): * Durations: watch=5157ms, gc=176ms, heap dump=8016ms, analysis=63575ms
12-13 15:08:26.869 D/LeakCanary( 1642): * Details:
12-13 15:08:26.869 D/LeakCanary( 1642): * Instance of android.view.inputmethod.InputMethodManager$ControlledInputConnectionWrapper
12-13 15:08:26.869 D/LeakCanary( 1642): | mActive = true
12-13 15:08:26.869 D/LeakCanary( 1642): | mParentInputMethodManager = android.view.inputmethod.InputMethodManager@316308208 (0x12da7af0)
12-13 15:08:26.869 D/LeakCanary( 1642): | mH = com.android.internal.view.IInputConnectionWrapper$MyHandler@319129568 (0x130587e0)
12-13 15:08:26.869 D/LeakCanary( 1642): | mInputConnection = java.lang.ref.WeakReference@319129600 (0x13058800)
12-13 15:08:26.869 D/LeakCanary( 1642): | mMainLooper = android.os.Looper@314581056 (0x12c02040)
12-13 15:08:26.869 D/LeakCanary( 1642): | mDescriptor = java.lang.String@1873348736 (0x6fa90880)
12-13 15:08:26.869 D/LeakCanary( 1642): | mObject = -1361251728
12-13 15:08:26.869 D/LeakCanary( 1642): | mOwner = android.view.inputmethod.InputMethodManager$ControlledInputConnectionWrapper@314574736 (0x12c00790)
12-13 15:08:26.869 D/LeakCanary( 1642): | shadow$_klass_ = android.view.inputmethod.InputMethodManager$ControlledInputConnectionWrapper
12-13 15:08:26.869 D/LeakCanary( 1642): | shadow$_monitor_ = 0
12-13 15:08:26.869 D/LeakCanary( 1642): * Instance of android.view.inputmethod.InputMethodManager
12-13 15:08:26.870 D/LeakCanary( 1642): | static RESULT_UNCHANGED_HIDDEN = 1
12-13 15:08:26.870 D/LeakCanary( 1642): | static MSG_SET_ACTIVE = 4
12-13 15:08:26.870 D/LeakCanary( 1642): | static RESULT_HIDDEN = 3
12-13 15:08:26.870 D/LeakCanary( 1642): | static REQUEST_UPDATE_CURSOR_ANCHOR_INFO_NONE = 0
12-13 15:08:26.870 D/LeakCanary( 1642): | static sInstance = android.view.inputmethod.InputMethodManager@316308208 (0x12da7af0)
12-13 15:08:26.870 D/LeakCanary( 1642): | static SHOW_FORCED = 2
12-13 15:08:26.870 D/LeakCanary( 1642): | static DISPATCH_NOT_HANDLED = 0
12-13 15:08:26.870 D/LeakCanary( 1642): | static HIDE_NOT_ALWAYS = 2
12-13 15:08:26.870 D/LeakCanary( 1642): | static NOT_AN_ACTION_NOTIFICATION_SEQUENCE_NUMBER = -1
12-13 15:08:26.870 D/LeakCanary( 1642): | static MSG_UNBIND = 3
12-13 15:08:26.870 D/LeakCanary( 1642): | static CONTROL_WINDOW_FIRST = 4
12-13 15:08:26.870 D/LeakCanary( 1642): | static CONTROL_START_INITIAL = 256
12-13 15:08:26.870 D/LeakCanary( 1642): | static RESULT_UNCHANGED_SHOWN = 0
12-13 15:08:26.870 D/LeakCanary( 1642): | static SHOW_IM_PICKER_MODE_AUTO = 0
12-13 15:08:26.870 D/LeakCanary( 1642): | static SHOW_IMPLICIT = 1
12-13 15:08:26.870 D/LeakCanary( 1642): | static CONTROL_WINDOW_VIEW_HAS_FOCUS = 1
12-13 15:08:26.870 D/LeakCanary( 1642): | static MSG_DUMP = 1
12-13 15:08:26.870 D/LeakCanary( 1642): | static TAG = java.lang.String@1873283504 (0x6fa809b0)
12-13 15:08:26.870 D/LeakCanary( 1642): | static SHOW_IM_PICKER_MODE_EXCLUDE_AUXILIARY_SUBTYPES = 2
12-13 15:08:26.870 D/LeakCanary( 1642): | static MSG_SEND_INPUT_EVENT = 5
12-13 15:08:26.870 D/LeakCanary( 1642): | static INPUT_METHOD_NOT_RESPONDING_TIMEOUT = 2500
12-13 15:08:26.870 D/LeakCanary( 1642): | static DEBUG = false
12-13 15:08:26.870 D/LeakCanary( 1642): | static PENDING_EVENT_COUNTER = java.lang.String@1873337528 (0x6fa8dcb8)
12-13 15:08:26.870 D/LeakCanary( 1642): | static RESULT_SHOWN = 2
12-13 15:08:26.871 D/LeakCanary( 1642): | static DISPATCH_IN_PROGRESS = -1
12-13 15:08:26.871 D/LeakCanary( 1642): | static MSG_FLUSH_INPUT_EVENT = 7
12-13 15:08:26.871 D/LeakCanary( 1642): | static $staticOverhead = byte[264]@1876294145 (0x6fd5fa01)
12-13 15:08:26.871 D/LeakCanary( 1642): | static CONTROL_WINDOW_IS_TEXT_EDITOR = 2
12-13 15:08:26.871 D/LeakCanary( 1642): | static MSG_TIMEOUT_INPUT_EVENT = 6
12-13 15:08:26.871 D/LeakCanary( 1642): | static MSG_BIND = 2
12-13 15:08:26.871 D/LeakCanary( 1642): | static DISPATCH_HANDLED = 1
12-13 15:08:26.871 D/LeakCanary( 1642): | static SHOW_IM_PICKER_MODE_INCLUDE_AUXILIARY_SUBTYPES = 1
12-13 15:08:26.871 D/LeakCanary( 1642): | static MSG_SET_USER_ACTION_NOTIFICATION_SEQUENCE_NUMBER = 9
12-13 15:08:26.871 D/LeakCanary( 1642): | static HIDE_IMPLICIT_ONLY = 1
12-13 15:08:26.871 D/LeakCanary( 1642): | mActive = false
12-13 15:08:26.871 D/LeakCanary( 1642): | mBindSequence = -1
12-13 15:08:26.871 D/LeakCanary( 1642): | mClient = android.view.inputmethod.InputMethodManager$1@314583040 (0x12c02800)
12-13 15:08:26.871 D/LeakCanary( 1642): | mCompletions = null
12-13 15:08:26.871 D/LeakCanary( 1642): | mCurChannel = null
12-13 15:08:26.871 D/LeakCanary( 1642): | mCurId = null
12-13 15:08:26.871 D/LeakCanary( 1642): | mCurMethod = null
12-13 15:08:26.871 D/LeakCanary( 1642): | mCurRootView = null
12-13 15:08:26.871 D/LeakCanary( 1642): | mCurSender = null
12-13 15:08:26.871 D/LeakCanary( 1642): | mCurrentTextBoxAttribute = null
12-13 15:08:26.871 D/LeakCanary( 1642): | mCursorAnchorInfo = null
12-13 15:08:26.871 D/LeakCanary( 1642): | mCursorCandEnd = 0
12-13 15:08:26.871 D/LeakCanary( 1642): | mCursorCandStart = 0
12-13 15:08:26.871 D/LeakCanary( 1642): | mCursorRect = android.graphics.Rect@316910368 (0x12e3ab20)
12-13 15:08:26.872 D/LeakCanary( 1642): | mCursorSelEnd = 0
12-13 15:08:26.872 D/LeakCanary( 1642): | mCursorSelStart = 0
12-13 15:08:26.872 D/LeakCanary( 1642): | mDummyInputConnection = android.view.inputmethod.BaseInputConnection@316910400 (0x12e3ab40)
12-13 15:08:26.872 D/LeakCanary( 1642): | mFullscreenMode = false
12-13 15:08:26.872 D/LeakCanary( 1642): | mH = android.view.inputmethod.InputMethodManager$H@316910432 (0x12e3ab60)
12-13 15:08:26.872 D/LeakCanary( 1642): | mHasBeenInactive = true
12-13 15:08:26.872 D/LeakCanary( 1642): | mIInputContext = android.view.inputmethod.InputMethodManager$ControlledInputConnectionWrapper@314574736 (0x12c00790)
12-13 15:08:26.872 D/LeakCanary( 1642): | mLastSentUserActionNotificationSequenceNumber = -1
12-13 15:08:26.872 D/LeakCanary( 1642): | mMainLooper = android.os.Looper@314581056 (0x12c02040)
12-13 15:08:26.872 D/LeakCanary( 1642): | mNextServedView = android.support.v7.widget.RecyclerView@316742656 (0x12e11c00)
12-13 15:08:26.872 D/LeakCanary( 1642): | mNextUserActionNotificationSequenceNumber = 2
12-13 15:08:26.872 D/LeakCanary( 1642): | mPendingEventPool = android.util.Pools$SimplePool@314580864 (0x12c01f80)
12-13 15:08:26.872 D/LeakCanary( 1642): | mPendingEvents = android.util.SparseArray@316910464 (0x12e3ab80)
12-13 15:08:26.872 D/LeakCanary( 1642): | mRequestUpdateCursorAnchorInfoMonitorMode = 0
12-13 15:08:26.872 D/LeakCanary( 1642): | mServedConnecting = true
12-13 15:08:26.872 D/LeakCanary( 1642): | mServedInputConnection = null
12-13 15:08:26.872 D/LeakCanary( 1642): | mServedInputConnectionWrapper = null
12-13 15:08:26.872 D/LeakCanary( 1642): | mServedView = android.support.v7.widget.RecyclerView@316742656 (0x12e11c00)
12-13 15:08:26.872 D/LeakCanary( 1642): | mService = com.android.internal.view.IInputMethodManager$Stub$Proxy@314580880 (0x12c01f90)
12-13 15:08:26.872 D/LeakCanary( 1642): | mTmpCursorRect = android.graphics.Rect@316910496 (0x12e3aba0)
12-13 15:08:26.872 D/LeakCanary( 1642): | shadow$_klass_ = android.view.inputmethod.InputMethodManager
12-13 15:08:26.872 D/LeakCanary( 1642): | shadow$_monitor_ = 0
12-13 15:08:26.872 D/LeakCanary( 1642): * Instance of android.support.v7.widget.RecyclerView
12-13 15:08:26.873 D/LeakCanary( 1642): | static TRACE_CREATE_VIEW_TAG = java.lang.String@315184464 (0x12c95550)
12-13 15:08:26.873 D/LeakCanary( 1642): | static TRACE_HANDLE_ADAPTER_UPDATES_TAG = java.lang.String@315097152 (0x12c80040)
12-13 15:08:26.873 D/LeakCanary( 1642): | static HORIZONTAL = 0
12-13 15:08:26.873 D/LeakCanary( 1642): | static SCROLL_STATE_IDLE = 0
12-13 15:08:26.873 D/LeakCanary( 1642): | static MIN_PREFETCH_TIME_NANOS = 4000000
12-13 15:08:26.873 D/LeakCanary( 1642): | static SCROLL_STATE_DRAGGING = 1
12-13 15:08:26.873 D/LeakCanary( 1642): | static ALLOW_PREFETCHING = true
12-13 15:08:26.873 D/LeakCanary( 1642): | static TRACE_BIND_VIEW_TAG = java.lang.String@314983472 (0x12c64430)
12-13 15:08:26.873 D/LeakCanary( 1642): | static INVALID_TYPE = -1
12-13 15:08:26.873 D/LeakCanary( 1642): | static TRACE_PREFETCH_TAG = java.lang.String@315109328 (0x12c82fd0)
12-13 15:08:26.873 D/LeakCanary( 1642): | static TRACE_SCROLL_TAG = java.lang.String@315072864 (0x12c7a160)
12-13 15:08:26.873 D/LeakCanary( 1642): | static SCROLL_STATE_SETTLING = 2
12-13 15:08:26.873 D/LeakCanary( 1642): | static NESTED_SCROLLING_ATTRS = int[1]@318192048 (0x12f739b0)
12-13 15:08:26.873 D/LeakCanary( 1642): | static sQuinticInterpolator = android.support.v7.widget.RecyclerView$3@317774352 (0x12f0da10)
12-13 15:08:26.873 D/LeakCanary( 1642): | static POST_UPDATES_ON_ANIMATION = true
12-13 15:08:26.873 D/LeakCanary( 1642): | static TRACE_ON_LAYOUT_TAG = java.lang.String@314774192 (0x12c312b0)
12-13 15:08:26.873 D/LeakCanary( 1642): | static INVALID_POINTER = -1
12-13 15:08:26.873 D/LeakCanary( 1642): | static FORCE_INVALIDATE_DISPLAY_LIST = false
12-13 15:08:26.873 D/LeakCanary( 1642): | static ALLOW_SIZE_IN_UNSPECIFIED_SPEC = true
12-13 15:08:26.873 D/LeakCanary( 1642): | static TAG = java.lang.String@314957392 (0x12c5de50)
12-13 15:08:26.873 D/LeakCanary( 1642): | static DEBUG = false
12-13 15:08:26.873 D/LeakCanary( 1642): | static VERTICAL = 1
12-13 15:08:26.873 D/LeakCanary( 1642): | static CLIP_TO_PADDING_ATTR = int[1]@318192032 (0x12f739a0)
12-13 15:08:26.874 D/LeakCanary( 1642): | static TRACE_ON_DATA_SET_CHANGE_LAYOUT_TAG = java.lang.String@315065344 (0x12c78400)
12-13 15:08:26.874 D/LeakCanary( 1642): | static LAYOUT_MANAGER_CONSTRUCTOR_SIGNATURE = java.lang.Class[4]@318980224 (0x13034080)
12-13 15:08:26.874 D/LeakCanary( 1642): | static $staticOverhead = byte[256]@316502017 (0x12dd7001)
12-13 15:08:26.874 D/LeakCanary( 1642): | static TOUCH_SLOP_DEFAULT = 0
12-13 15:08:26.874 D/LeakCanary( 1642): | static NO_POSITION = -1
12-13 15:08:26.874 D/LeakCanary( 1642): | static sFrameIntervalNanos = 16666667
12-13 15:08:26.874 D/LeakCanary( 1642): | static MAX_SCROLL_DURATION = 2000
12-13 15:08:26.874 D/LeakCanary( 1642): | static TOUCH_SLOP_PAGING = 1
12-13 15:08:26.874 D/LeakCanary( 1642): | static DISPATCH_TEMP_DETACH = false
12-13 15:08:26.874 D/LeakCanary( 1642): | static NO_ID = -1
12-13 15:08:26.874 D/LeakCanary( 1642): | mAccessibilityDelegate = android.support.v7.widget.RecyclerViewAccessibilityDelegate@316910560 (0x12e3abe0)
12-13 15:08:26.874 D/LeakCanary( 1642): | mAccessibilityManager = android.view.accessibility.AccessibilityManager@316731600 (0x12e0f0d0)
12-13 15:08:26.874 D/LeakCanary( 1642): | mActiveOnItemTouchListener = null
12-13 15:08:26.874 D/LeakCanary( 1642): | mAdapter = com.blueapron.mobile.ui.adapters.RecipeOverviewAdapter@316910592 (0x12e3ac00)
12-13 15:08:26.874 D/LeakCanary( 1642): | mAdapterHelper = android.support.v7.widget.AdapterHelper@316914752 (0x12e3bc40)
12-13 15:08:26.874 D/LeakCanary( 1642): | mAdapterUpdateDuringMeasure = false
12-13 15:08:26.874 D/LeakCanary( 1642): | mBottomGlow = null
12-13 15:08:26.874 D/LeakCanary( 1642): | mChildDrawingOrderCallback = null
12-13 15:08:26.874 D/LeakCanary( 1642): | mChildHelper = android.support.v7.widget.ChildHelper@316910624 (0x12e3ac20)
12-13 15:08:26.874 D/LeakCanary( 1642): | mClipToPadding = true
12-13 15:08:26.874 D/LeakCanary( 1642): | mDataSetHasChangedAfterLayout = false
12-13 15:08:26.874 D/LeakCanary( 1642): | mDispatchScrollCounter = 0
12-13 15:08:26.875 D/LeakCanary( 1642): | mEatRequestLayout = 0
12-13 15:08:26.875 D/LeakCanary( 1642): | mEatenAccessibilityChangeFlags = 0
12-13 15:08:26.875 D/LeakCanary( 1642): | mFirstLayoutComplete = true
12-13 15:08:26.875 D/LeakCanary( 1642): | mHasFixedSize = false
12-13 15:08:26.875 D/LeakCanary( 1642): | mIgnoreMotionEventTillDown = false
12-13 15:08:26.875 D/LeakCanary( 1642): | mInitialTouchX = 346
12-13 15:08:26.875 D/LeakCanary( 1642): | mInitialTouchY = 1293
12-13 15:08:26.875 D/LeakCanary( 1642): | mIsAttached = false
12-13 15:08:26.875 D/LeakCanary( 1642): | mItemAnimator = android.support.v7.widget.DefaultItemAnimator@315199296 (0x12c98f40)
12-13 15:08:26.875 D/LeakCanary( 1642): | mItemAnimatorListener = android.support.v7.widget.RecyclerView$ItemAnimatorRestoreListener@314580896 (0x12c01fa0)
12-13 15:08:26.875 D/LeakCanary( 1642): | mItemAnimatorRunner = android.support.v7.widget.RecyclerView$2@314580912 (0x12c01fb0)
12-13 15:08:26.875 D/LeakCanary( 1642): | mItemDecorations = java.util.ArrayList@316910656 (0x12e3ac40)
12-13 15:08:26.875 D/LeakCanary( 1642): | mItemsAddedOrRemoved = false
12-13 15:08:26.875 D/LeakCanary( 1642): | mItemsChanged = false
12-13 15:08:26.875 D/LeakCanary( 1642): | mLastTouchX = 346
12-13 15:08:26.875 D/LeakCanary( 1642): | mLastTouchY = 1293
12-13 15:08:26.875 D/LeakCanary( 1642): | mLayout = android.support.v7.widget.LinearLayoutManager@316926400 (0x12e3e9c0)
12-13 15:08:26.875 D/LeakCanary( 1642): | mLayoutFrozen = false
12-13 15:08:26.875 D/LeakCanary( 1642): | mLayoutOrScrollCounter = 0
12-13 15:08:26.875 D/LeakCanary( 1642): | mLayoutRequestEaten = false
12-13 15:08:26.875 D/LeakCanary( 1642): | mLeftGlow = null
12-13 15:08:26.875 D/LeakCanary( 1642): | mMaxFlingVelocity = 28000
12-13 15:08:26.875 D/LeakCanary( 1642): | mMinFlingVelocity = 175
12-13 15:08:26.876 D/LeakCanary( 1642): | mMinMaxLayoutPositions = int[2]@316910688 (0x12e3ac60)
12-13 15:08:26.876 D/LeakCanary( 1642): | mNestedOffsets = int[2]@316910720 (0x12e3ac80)
12-13 15:08:26.876 D/LeakCanary( 1642): | mObserver = android.support.v7.widget.RecyclerView$RecyclerViewDataObserver@314580928 (0x12c01fc0)
12-13 15:08:26.876 D/LeakCanary( 1642): | mOnChildAttachStateListeners = null
12-13 15:08:26.876 D/LeakCanary( 1642): | mOnFlingListener = null
12-13 15:08:26.876 D/LeakCanary( 1642): | mOnItemTouchListeners = java.util.ArrayList@316910752 (0x12e3aca0)
12-13 15:08:26.876 D/LeakCanary( 1642): | mPendingAccessibilityImportanceChange = java.util.ArrayList@316910784 (0x12e3acc0)
12-13 15:08:26.876 D/LeakCanary( 1642): | mPendingSavedState = null
12-13 15:08:26.876 D/LeakCanary( 1642): | mPostedAnimatorRunner = false
12-13 15:08:26.876 D/LeakCanary( 1642): | mPreserveFocusAfterLayout = true
12-13 15:08:26.876 D/LeakCanary( 1642): | mRecycler = android.support.v7.widget.RecyclerView$Recycler@316914800 (0x12e3bc70)
12-13 15:08:26.876 D/LeakCanary( 1642): | mRecyclerListener = null
12-13 15:08:26.876 D/LeakCanary( 1642): | mRightGlow = null
12-13 15:08:26.876 D/LeakCanary( 1642): | mScrollConsumed = int[2]@316910816 (0x12e3ace0)
12-13 15:08:26.876 D/LeakCanary( 1642): | mScrollFactor = 1.4E-45
12-13 15:08:26.876 D/LeakCanary( 1642): | mScrollListener = null
12-13 15:08:26.876 D/LeakCanary( 1642): | mScrollListeners = null
12-13 15:08:26.876 D/LeakCanary( 1642): | mScrollOffset = int[2]@316910848 (0x12e3ad00)
12-13 15:08:26.876 D/LeakCanary( 1642): | mScrollPointerId = 0
12-13 15:08:26.876 D/LeakCanary( 1642): | mScrollState = 0
12-13 15:08:26.876 D/LeakCanary( 1642): | mScrollingChildHelper = android.support.v4.view.NestedScrollingChildHelper@316910880 (0x12e3ad20)
12-13 15:08:26.876 D/LeakCanary( 1642): | mState = android.support.v7.widget.RecyclerView$State@316918016 (0x12e3c900)
12-13 15:08:26.876 D/LeakCanary( 1642): | mTempRect = android.graphics.Rect@316910912 (0x12e3ad40)
12-13 15:08:26.876 D/LeakCanary( 1642): | mTempRect2 = android.graphics.Rect@316910944 (0x12e3ad60)
12-13 15:08:26.877 D/LeakCanary( 1642): | mTempRectF = android.graphics.RectF@316910976 (0x12e3ad80)
12-13 15:08:26.877 D/LeakCanary( 1642): | mTopGlow = null
12-13 15:08:26.877 D/LeakCanary( 1642): | mTouchSlop = 28
12-13 15:08:26.877 D/LeakCanary( 1642): | mUpdateChildViewsRunnable = android.support.v7.widget.RecyclerView$1@314580944 (0x12c01fd0)
12-13 15:08:26.877 D/LeakCanary( 1642): | mVelocityTracker = android.view.VelocityTracker@316911008 (0x12e3ada0)
12-13 15:08:26.877 D/LeakCanary( 1642): | mViewFlinger = android.support.v7.widget.RecyclerView$ViewFlinger@316911040 (0x12e3adc0)
12-13 15:08:26.877 D/LeakCanary( 1642): | mViewInfoProcessCallback = android.support.v7.widget.RecyclerView$4@314580960 (0x12c01fe0)
12-13 15:08:26.877 D/LeakCanary( 1642): | mViewInfoStore = android.support.v7.widget.ViewInfoStore@314580976 (0x12c01ff0)
12-13 15:08:26.877 D/LeakCanary( 1642): | mViewPrefetcher = android.support.v7.widget.RecyclerView$ViewPrefetcher@316911072 (0x12e3ade0)
12-13 15:08:26.877 D/LeakCanary( 1642): | mAnimationListener = null
12-13 15:08:26.877 D/LeakCanary( 1642): | mCachePaint = null
12-13 15:08:26.877 D/LeakCanary( 1642): | mChildAcceptsDrag = false
12-13 15:08:26.877 D/LeakCanary( 1642): | mChildCountWithTransientState = 0
12-13 15:08:26.877 D/LeakCanary( 1642): | mChildTransformation = null
12-13 15:08:26.877 D/LeakCanary( 1642): | mChildren = android.view.View[12]@316918080 (0x12e3c940)
12-13 15:08:26.878 D/LeakCanary( 1642): | mChildrenCount = 2
12-13 15:08:26.878 D/LeakCanary( 1642): | mCurrentDrag = null
12-13 15:08:26.878 D/LeakCanary( 1642): | mCurrentDragView = null
12-13 15:08:26.878 D/LeakCanary( 1642): | mDisappearingChildren = null
12-13 15:08:26.878 D/LeakCanary( 1642): | mDragNotifiedChildren = null
12-13 15:08:26.878 D/LeakCanary( 1642): | mFirstHoverTarget = null
12-13 15:08:26.878 D/LeakCanary( 1642): | mFirstTouchTarget = null
12-13 15:08:26.878 D/LeakCanary( 1642): | mFocused = null
12-13 15:08:26.878 D/LeakCanary( 1642): | mGroupFlags = 2375763
12-13 15:08:26.878 D/LeakCanary( 1642): | mHoveredSelf = false
12-13 15:08:26.878 D/LeakCanary( 1642): | mInvalidateRegion = null
12-13 15:08:26.878 D/LeakCanary( 1642): | mInvalidationTransformation = null
12-13 15:08:26.878 D/LeakCanary( 1642): | mLastTouchDownIndex = -1
12-13 15:08:26.878 D/LeakCanary( 1642): | mLastTouchDownTime = 0
12-13 15:08:26.878 D/LeakCanary( 1642): | mLastTouchDownX = 346.0
12-13 15:08:26.878 D/LeakCanary( 1642): | mLastTouchDownY = 1293.0
12-13 15:08:26.878 D/LeakCanary( 1642): | mLayoutAnimationController = null
12-13 15:08:26.878 D/LeakCanary( 1642): | mLayoutCalledWhileSuppressed = false
12-13 15:08:26.879 D/LeakCanary( 1642): | mLayoutMode = -1
12-13 15:08:26.879 D/LeakCanary( 1642): | mLayoutTransitionListener = android.view.ViewGroup$2@317091952 (0x12e67070)
12-13 15:08:26.879 D/LeakCanary( 1642): | mLocalPoint = null
12-13 15:08:26.879 D/LeakCanary( 1642): | mNestedScrollAxes = 0
12-13 15:08:26.879 D/LeakCanary( 1642): | mOnHierarchyChangeListener = null
12-13 15:08:26.879 D/LeakCanary( 1642): | mPersistentDrawingCache = 2
12-13 15:08:26.879 D/LeakCanary( 1642): | mPreSortedChildren = null
12-13 15:08:26.879 D/LeakCanary( 1642): | mSuppressLayout = false
12-13 15:08:26.879 D/LeakCanary( 1642): | mTempPoint = float[2]@316911104 (0x12e3ae00)
12-13 15:08:26.879 D/LeakCanary( 1642): | mTransientIndices = null
12-13 15:08:26.879 D/LeakCanary( 1642): | mTransientViews = null
12-13 15:08:26.879 D/LeakCanary( 1642): | mTransition = null
12-13 15:08:26.879 D/LeakCanary( 1642): | mTransitioningViews = null
12-13 15:08:26.879 D/LeakCanary( 1642): | mVisibilityChangingChildren = null
12-13 15:08:26.879 D/LeakCanary( 1642): | mAccessibilityCursorPosition = -1
12-13 15:08:26.879 D/LeakCanary( 1642): | mAccessibilityDelegate = android.support.v4.view.AccessibilityDelegateCompatJellyBean$1@317091968 (0x12e67080)
12-13 15:08:26.879 D/LeakCanary( 1642): | mAccessibilityTraversalAfterId = -1
12-13 15:08:26.879 D/LeakCanary( 1642): | mAccessibilityTraversalBeforeId = -1
12-13 15:08:26.879 D/LeakCanary( 1642): | mAccessibilityViewId = -1
12-13 15:08:26.879 D/LeakCanary( 1642): | mAnimator = null
12-13 15:08:26.879 D/LeakCanary( 1642): | mAttachInfo = null
12-13 15:08:26.880 D/LeakCanary( 1642): | mAttributes = null
12-13 15:08:26.880 D/LeakCanary( 1642): | mBackground = null
12-13 15:08:26.880 D/LeakCanary( 1642): | mBackgroundRenderNode = null
12-13 15:08:26.880 D/LeakCanary( 1642): | mBackgroundResource = 0
12-13 15:08:26.880 D/LeakCanary( 1642): | mBackgroundSizeChanged = true
12-13 15:08:26.880 D/LeakCanary( 1642): | mBackgroundTint = null
12-13 15:08:26.880 D/LeakCanary( 1642): | mBottom = 2112
12-13 15:08:26.880 D/LeakCanary( 1642): | mCachingFailed = false
12-13 15:08:26.880 D/LeakCanary( 1642): | mClipBounds = null
12-13 15:08:26.880 D/LeakCanary( 1642): | mContentDescription = null
12-13 15:08:26.880 D/LeakCanary( 1642): | mContext = com.blueapron.mobile.ui.MainActivity@314783456 (0x12c336e0)
12-13 15:08:26.880 D/LeakCanary( 1642): | mCurrentAnimation = null
12-13 15:08:26.880 D/LeakCanary( 1642): | mDrawableState = int[2]@1874654592 (0x6fbcf580)
12-13 15:08:26.880 D/LeakCanary( 1642): | mDrawingCache = null
12-13 15:08:26.880 D/LeakCanary( 1642): | mDrawingCacheBackgroundColor = 0
12-13 15:08:26.880 D/LeakCanary( 1642): | mFloatingTreeObserver = null
12-13 15:08:26.880 D/LeakCanary( 1642): | mForegroundInfo = null
12-13 15:08:26.880 D/LeakCanary( 1642): | mGhostView = null
12-13 15:08:26.880 D/LeakCanary( 1642): | mHasPerformedLongPress = false
12-13 15:08:26.880 D/LeakCanary( 1642): | mID = 2131624065
12-13 15:08:26.880 D/LeakCanary( 1642): | mIgnoreNextUpEvent = false
12-13 15:08:26.880 D/LeakCanary( 1642): | mInContextButtonPress = false
12-13 15:08:26.881 D/LeakCanary( 1642): | mInputEventConsistencyVerifier = null
12-13 15:08:26.881 D/LeakCanary( 1642): | mKeyedTags = android.util.SparseArray@316911136 (0x12e3ae20)
12-13 15:08:26.881 D/LeakCanary( 1642): | mLabelForId = -1
12-13 15:08:26.881 D/LeakCanary( 1642): | mLastIsOpaque = false
12-13 15:08:26.881 D/LeakCanary( 1642): | mLayerPaint = null
12-13 15:08:26.881 D/LeakCanary( 1642): | mLayerType = 0
12-13 15:08:26.881 D/LeakCanary( 1642): | mLayoutInsets = null
12-13 15:08:26.881 D/LeakCanary( 1642): | mLayoutParams = android.support.v4.view.ViewPager$LayoutParams@316914848 (0x12e3bca0)
12-13 15:08:26.881 D/LeakCanary( 1642): | mLeft = 0
12-13 15:08:26.881 D/LeakCanary( 1642): | mLeftPaddingDefined = false
12-13 15:08:26.881 D/LeakCanary( 1642): | mListenerInfo = null
12-13 15:08:26.881 D/LeakCanary( 1642): | mMatchIdPredicate = null
12-13 15:08:26.881 D/LeakCanary( 1642): | mMatchLabelForPredicate = null
12-13 15:08:26.881 D/LeakCanary( 1642): | mMeasureCache = android.util.LongSparseLongArray@316911168 (0x12e3ae40)
12-13 15:08:26.881 D/LeakCanary( 1642): | mMeasuredHeight = 2112
12-13 15:08:26.881 D/LeakCanary( 1642): | mMeasuredWidth = 1440
12-13 15:08:26.881 D/LeakCanary( 1642): | mMinHeight = 0
12-13 15:08:26.881 D/LeakCanary( 1642): | mMinWidth = 0
12-13 15:08:26.881 D/LeakCanary( 1642): | mNestedScrollingParent = null
12-13 15:08:26.881 D/LeakCanary( 1642): | mNextFocusDownId = -1
12-13 15:08:26.881 D/LeakCanary( 1642): | mNextFocusForwardId = -1
12-13 15:08:26.882 D/LeakCanary( 1642): | mNextFocusLeftId = -1
12-13 15:08:26.882 D/LeakCanary( 1642): | mNextFocusRightId = -1
12-13 15:08:26.882 D/LeakCanary( 1642): | mNextFocusUpId = -1
12-13 15:08:26.882 D/LeakCanary( 1642): | mOldHeightMeasureSpec = 1073743936
12-13 15:08:26.882 D/LeakCanary( 1642): | mOldWidthMeasureSpec = 1073743264
12-13 15:08:26.882 D/LeakCanary( 1642): | mOutlineProvider = android.view.ViewOutlineProvider$1@1874649728 (0x6fbce280)
12-13 15:08:26.882 D/LeakCanary( 1642): | mOverScrollMode = 1
12-13 15:08:26.882 D/LeakCanary( 1642): | mOverlay = null
12-13 15:08:26.882 D/LeakCanary( 1642): | mPaddingBottom = 0
12-13 15:08:26.882 D/LeakCanary( 1642): | mPaddingLeft = 0
12-13 15:08:26.882 D/LeakCanary( 1642): | mPaddingRight = 0
12-13 15:08:26.882 D/LeakCanary( 1642): | mPaddingTop = 0
12-13 15:08:26.882 D/LeakCanary( 1642): | mParent = null
12-13 15:08:26.882 D/LeakCanary( 1642): | mPendingCheckForLongPress = null
12-13 15:08:26.882 D/LeakCanary( 1642): | mPendingCheckForTap = null
12-13 15:08:26.882 D/LeakCanary( 1642): | mPerformClick = null
12-13 15:08:26.882 D/LeakCanary( 1642): | mPrivateFlags = -2127947760
12-13 15:08:26.882 D/LeakCanary( 1642): | mPrivateFlags2 = 1611867688
12-13 15:08:26.882 D/LeakCanary( 1642): | mPrivateFlags3 = 16
12-13 15:08:26.882 D/LeakCanary( 1642): | mRecreateDisplayList = false
12-13 15:08:26.883 D/LeakCanary( 1642): | mRenderNode = android.view.RenderNode@316911200 (0x12e3ae60)
12-13 15:08:26.883 D/LeakCanary( 1642): | mResources = android.content.res.Resources@316926480 (0x12e3ea10)
12-13 15:08:26.883 D/LeakCanary( 1642): | mRight = 1440
12-13 15:08:26.883 D/LeakCanary( 1642): | mRightPaddingDefined = false
12-13 15:08:26.883 D/LeakCanary( 1642): | mScrollCache = null
12-13 15:08:26.883 D/LeakCanary( 1642): | mScrollIndicatorDrawable = null
12-13 15:08:26.883 D/LeakCanary( 1642): | mScrollX = 0
12-13 15:08:26.883 D/LeakCanary( 1642): | mScrollY = 0
12-13 15:08:26.883 D/LeakCanary( 1642): | mSendViewScrolledAccessibilityEvent = null
12-13 15:08:26.883 D/LeakCanary( 1642): | mSendViewStateChangedAccessibilityEvent = null
12-13 15:08:26.883 D/LeakCanary( 1642): | mSendingHoverAccessibilityEvents = false
12-13 15:08:26.883 D/LeakCanary( 1642): | mStartActivityRequestWho = null
12-13 15:08:26.883 D/LeakCanary( 1642): | mStateListAnimator = null
12-13 15:08:26.883 D/LeakCanary( 1642): | mSystemUiVisibility = 0
12-13 15:08:26.883 D/LeakCanary( 1642): | mTag = null
12-13 15:08:26.883 D/LeakCanary( 1642): | mTempNestedScrollConsumed = null
12-13 15:08:26.883 D/LeakCanary( 1642): | mTop = 0
12-13 15:08:26.883 D/LeakCanary( 1642): | mTouchDelegate = null
12-13 15:08:26.883 D/LeakCanary( 1642): | mTouchSlop = 28
12-13 15:08:26.883 D/LeakCanary( 1642): | mTransformationInfo = android.view.View$TransformationInfo@316911232 (0x12e3ae80)
12-13 15:08:26.883 D/LeakCanary( 1642): | mTransientStateCount = 0
12-13 15:08:26.884 D/LeakCanary( 1642): | mTransitionName = null
最佳答案
我希望你已经知道原因了,但对于以后阅读这篇文章的其他人来说,我认为显示已排除和已知泄漏的原因是:-
关于android - LeakCanary 似乎检测到泄漏,即使该类已被排除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41129967/
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r
Heroku支持人员告诉我,为了在我的Web应用程序中使用自定义字体(未安装在系统中,您可以在bash控制台中使用fc-list查看已安装的字体)我必须部署一个包含所有字体的.fonts文件夹里面的字体。问题是我不知道该怎么做。我的意思是,我不知道文件名是否必须遵循heroku的任何特殊模式,或者我必须在我的代码中做一些事情来考虑这种字体,或者如果我将它包含在文件夹中它是自动的......事实是,我尝试以不同的方式更改字体的文件名,但根本没有使用该字体。为了提供更多详细信息,我们使用字体的过程是将PDF转换为图像,更具体地说,使用rghostgem。并且最终图像根本不使用自定义字体。在
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
这是一个例子:s="abcd+subtext@example.com"s.match(/+[^@]*/)Result=>"+subtext"问题是,我不想在其中包含“+”。我希望结果是“潜台词”,没有+ 最佳答案 您可以在正则表达式中使用括号来创建匹配组:s="abcd+subtext@example.com"s=~/\+([^@]*)/&&$1=>"subtext" 关于ruby-正则表达式-排除一个字符,我们在StackOverflow上找到一个类似的问题:
我花了几天时间尝试安装ruby1.9.2并让它与gems一起工作:-/我最终放弃了我的MacOSX10.6机器,下面是我的Ubuntu机器上的当前状态。任何建议将不胜感激!#rubytest.rb:29:in`require':nosuchfiletoload--mongo(LoadError)from:29:in`require'fromtest.rb:1:in`'#cattest.rbrequire'mongo'db=Mongo::Connection.new.db("mydb")#gemwhichmongo/usr/local/rvm/gems/ruby-1.9.2-p0/g
我想知道我应该引用什么异常名称。我的日期无效。我检查了文档,但找不到。BeginDate.new(day,month,year)Rescueexceptionnamestatements 最佳答案 我认为您正在寻找ArgumentError.使用irb:>Date.new(2,-200,3)ArgumentError:invaliddatefrom(irb):11:in`new'from(irb):11所以beginDate.new(2,-200,3)rescueArgumentError#yourlogicend
运行:ruby1.9.3p0和Rails3.2.1尝试使用rspec但当我尝试将其安装到我的应用程序中时出现以下错误:/Users/Si/.rvm/gems/ruby-1.9.3-p0/gems/railties-3.2.1/lib/rails/railtie/configuration.rb:85:in`method_missing':undefinedmethod`generators'for#(NoMethodError)from/Users/Si/.rvm/gems/ruby-1.9.3-p0/gems/rspec-rails-2.0.0.beta.18/lib/rspec-r
我正在开发一个xcode自动构建系统。在执行一些预构建验证时,我想检查指定的证书文件是否已被撤销。我了解securityverify-cert验证其他证书属性但不验证吊销。我如何检查撤销?我正在用Ruby编写构建系统,但我对任何语言的想法都持开放态度。我阅读了这个答案(Openssl-Howtocheckifacertificateisrevokedornot),但指向底部的链接(DoesOpenSSLautomaticallyhandleCRLs(CertificateRevocationLists)now?)进入的Material对我的目的来说有点过于复杂(用户上传已撤销的证书是一
我想知道我的代码是否在rspec下运行。这可能吗?原因是我正在加载一些错误记录器,这些记录器在测试期间会被故意错误(expect{x}.toraise_error)弄得乱七八糟。我查看了我的ENV变量,没有(明显的)测试环境变量的迹象。 最佳答案 在spec_helper.rb的开头添加:ENV['RACK_ENV']='test'现在您可以在代码中检查RACK_ENV是否经过测试。 关于ruby-检测由RSpec、Ruby运行的代码,我们在StackOverflow上找到一个类似的问题