Skip to content

Commit 1c0619e

Browse files
committed
Fix lifecycle management for multiple TurboImageView instances
- Replace single lateinit imageView with WeakHashMap to track all views - Properly handle multiple view instances in lifecycle callbacks - Fix crash when multiple images are used and app backgrounds/resumes - Ensures all attached views are disposed and reloaded correctly
1 parent 40aad31 commit 1c0619e

1 file changed

Lines changed: 11 additions & 6 deletions

File tree

android/src/main/java/com/turboimage/TurboImageViewManager.kt

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ import com.facebook.react.uimanager.SimpleViewManager
2323
import com.facebook.react.uimanager.ThemedReactContext
2424
import com.facebook.react.uimanager.UIManagerHelper
2525
import com.facebook.react.uimanager.annotations.ReactProp
26+
import java.util.Collections
27+
import java.util.WeakHashMap
2628
import okhttp3.Headers
2729
import com.turboimage.decoder.APNGDecoder
2830
import com.turboimage.events.ProgressEvent
@@ -34,7 +36,8 @@ import androidx.core.graphics.drawable.toDrawable
3436
class TurboImageViewManager : SimpleViewManager<TurboImageView>(), LifecycleEventListener {
3537
override fun getName() = REACT_CLASS
3638

37-
private lateinit var imageView: TurboImageView
39+
private val attachedViews =
40+
Collections.newSetFromMap(WeakHashMap<TurboImageView, Boolean>())
3841
private var isInBackground = false
3942
override fun getExportedCustomDirectEventTypeConstants(): MutableMap<String, Any>? {
4043
return MapBuilder.of(
@@ -48,8 +51,7 @@ class TurboImageViewManager : SimpleViewManager<TurboImageView>(), LifecycleEven
4851

4952
override fun createViewInstance(reactContext: ThemedReactContext): TurboImageView {
5053
reactContext.addLifecycleEventListener(this)
51-
imageView = TurboImageView(reactContext)
52-
return imageView
54+
return TurboImageView(reactContext).also { attachedViews.add(it) }
5355
}
5456

5557
override fun onAfterUpdateTransaction(view: TurboImageView) {
@@ -60,6 +62,7 @@ class TurboImageViewManager : SimpleViewManager<TurboImageView>(), LifecycleEven
6062
override fun onDropViewInstance(view: TurboImageView) {
6163
super.onDropViewInstance(view)
6264
view.dispose()
65+
attachedViews.remove(view)
6366
}
6467

6568
private fun reloadImage(view: TurboImageView) {
@@ -253,16 +256,18 @@ class TurboImageViewManager : SimpleViewManager<TurboImageView>(), LifecycleEven
253256

254257
override fun onHostResume() {
255258
if (isInBackground) {
256-
reloadImage(imageView)
259+
attachedViews.toList().forEach { reloadImage(it) }
260+
isInBackground = false
257261
}
258262
}
259263

260264
override fun onHostPause() {
261-
imageView.dispose()
265+
attachedViews.toList().forEach { it.dispose() }
262266
isInBackground = true
263267
}
264268

265269
override fun onHostDestroy() {
266-
imageView.dispose()
270+
attachedViews.toList().forEach { it.dispose() }
271+
attachedViews.clear()
267272
}
268273
}

0 commit comments

Comments
 (0)