emilsjolander/StickyScrollViewItems

Memory leak due to invalidateRunnable

Opened this issue · 1 comments

There needs to be a public methods to remove the invalidateRunnable via a destroy method so that when the view is destroyed we can remove the callbacks.

`09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: In com.example.dev:0.2.37-SNAPSHOT:23700.
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: * com.example..ui.activities.PitchDetailActivity has leaked:
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: * GC ROOT android.os.MessageQueue.mMessages
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: * references android.os.Message.callback
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: * references com.emilsjolander.components.StickyScrollViewItems.StickyScrollView$1.this$0 (anonymous implementation of java.lang.Runnable)
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: * references com.example..ui.widget.CustomStickyScrollView.mContext
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: * leaks com.example.dev.ui.activities.ProjectDetailActivity instance
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: * Retaining: 1.8 MB.
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: * Reference Key: c91713eb-9995-4b63-8de8-a27ac96b105b
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: * Device: motorola motorola MotoG3 osprey_retasia_ds_2gb
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: * Android Version: 6.0.1 API: 23 LeakCanary: 1.4-beta2 3799172
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: * Durations: watch=5031ms, gc=153ms, heap dump=3777ms, analysis=40546ms
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: * Details:
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: * Instance of android.os.MessageQueue
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: | static $staticOverhead = byte[16]@1870796625 (0x6f821751)
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: | static DEBUG = false
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: | static TAG = java.lang.String@1867732192 (0x6f5354e0)
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: | mBlocked = true
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: | mFileDescriptorRecords = null
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: | mIdleHandlers = java.util.ArrayList@315326112 (0x12cb7ea0)
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: | mMessages = android.os.Message@319619136 (0x130d0040)
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: | mNextBarrierToken = 410
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: | mPendingIdleHandlers = android.os.MessageQueue$IdleHandler[4]@320314944 (0x13179e40)
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: | mPtr = -1193766368
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: | mQuitAllowed = false
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: | mQuitting = false
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: | shadow$klass = android.os.MessageQueue
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: | shadow$monitor = 0
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: * Instance of android.os.Message
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: | static sPoolSync = java.lang.Object@1870012616 (0x6f7620c8)
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: | static FLAG_IN_USE = 1
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: | static sPool = android.os.Message@318269376 (0x12f867c0)
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: | static gCheckRecycle = true
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: | static MAX_POOL_SIZE = 50
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: | static FLAG_ASYNCHRONOUS = 2
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: | static $staticOverhead = byte[72]@1871649129 (0x6f8f1969)
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: | static CREATOR = android.os.Message$1@1870012624 (0x6f7620d0)
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: | static FLAGS_TO_CLEAR_ON_COPY_FROM = 1
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: | static sPoolSize = 21
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: | arg1 = 0
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: | arg2 = 0
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: | callback = com.emilsjolander.components.StickyScrollViewItems.StickyScrollView$1@317791024 (0x12f11b30)
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: | data = null
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: | flags = 1
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: | next = android.os.Message@318307200 (0x12f8fb80)
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: | obj = null
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: | replyTo = null
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: | sendingUid = -1
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: | target = android.view.ViewRootImpl$ViewRootHandler@315147680 (0x12c8c5a0)
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: | what = 0
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: | when = 284491965
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: | shadow$klass = android.os.Message
09-19 18:29:03.064 2752-7788/com.example.dev D/LeakCanary: | shadow$monitor = 0

notifyStickyAttributeChanged() It`s possible used