@@ -78,27 +78,39 @@ public class AnimatedDrawable(
7878
7979 private val measuredTimesStore = mutableListOf<Int >()
8080
81- private fun makeDecodingRunner (nextFrameIndex : Int ): Runnable {
82- return DecodeFrameRunnable (
83- syncedFrames,
84- frameStore,
85- lock,
86- nextFrameIndex,
87- measuredTimesStore
88- )
89- }
81+ private var shouldClearCache = frameStore.framesCount > preheatFrames
82+
83+ private fun makeDecodingRunner (
84+ nextFrameIndex : Int
85+ ): Runnable = DecodeFrameRunnable (
86+ syncedFrames = syncedFrames,
87+ frameStore = frameStore,
88+ lock = lock,
89+ nextFrameIndex = nextFrameIndex,
90+ measuredTimesStore = measuredTimesStore,
91+ preheatFrames = preheatFrames,
92+ shouldClearCache = shouldClearCache
93+ )
9094
9195 private class DecodeFrameRunnable (
9296 private val syncedFrames : MutableList <SyncedFrame >,
9397 private val frameStore : AnimatedFrameStore ,
9498 private val lock : Any ,
9599 private val nextFrameIndex : Int ,
96100 private val measuredTimesStore : MutableList <Int >,
101+ private val preheatFrames : Int ,
102+ private val shouldClearCache : Boolean
97103 ) : Runnable {
98104 override fun run () {
99105 val measureTime = measureTimeMillis {
100106 val syncedNextFrame = syncedFrames.firstOrNull { it.frameIndex == nextFrameIndex }
101107 if (syncedNextFrame == null ) {
108+ if (shouldClearCache) {
109+ val firstFromNext = nextFrameIndex - preheatFrames
110+ if (syncedFrames.firstOrNull { it.frameIndex == firstFromNext } != null ) {
111+ syncedFrames.removeIf { it.frameIndex == firstFromNext }
112+ }
113+ }
102114 val nextFrame = frameStore.getFrame(nextFrameIndex)
103115 val nextFrameDuration = frameStore.getFrameDuration(nextFrameIndex)
104116 synchronized(lock) {
0 commit comments