diff --git a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/android/react/renderer/imagemanager/ImageFetcher.cpp b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/android/react/renderer/imagemanager/ImageFetcher.cpp index 771ab980ed26a7..a3e4719135f2bc 100644 --- a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/android/react/renderer/imagemanager/ImageFetcher.cpp +++ b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/android/react/renderer/imagemanager/ImageFetcher.cpp @@ -10,9 +10,39 @@ #include #include #include +#include namespace facebook::react { +class ImageFetcherCommitHook : public UIManagerCommitHook { + public: + explicit ImageFetcherCommitHook(ImageFetcher* fetcher) : fetcher_(fetcher) {} + + RootShadowNode::Unshared shadowTreeWillCommit( + const ShadowTree& /*shadowTree*/, + const RootShadowNode::Shared& /*oldRootShadowNode*/, + const RootShadowNode::Unshared& newRootShadowNode, + const ShadowTree::CommitOptions& /*commitOptions*/) noexcept override { + if (fetcher_ != nullptr) { + fetcher_->flushImageRequests(); + } + return newRootShadowNode; + } + + void commitHookWasRegistered( + const UIManager& /*uiManager*/) noexcept override {} + + void commitHookWasUnregistered( + const UIManager& /*uiManager*/) noexcept override {} + + void invalidate() { + fetcher_ = nullptr; + } + + private: + ImageFetcher* fetcher_; +}; + ImageFetcher::ImageFetcher( std::shared_ptr contextContainer) : contextContainer_(std::move(contextContainer)) { @@ -22,20 +52,24 @@ ImageFetcher::ImageFetcher( ->find>( std::string(UIManagerCommitHookManagerKey)); uiManagerCommitHookManager.has_value()) { - (*uiManagerCommitHookManager)->registerCommitHook(*this); + commitHook_ = std::make_unique(this); + (*uiManagerCommitHookManager)->registerCommitHook(*commitHook_); } } } ImageFetcher::~ImageFetcher() { - if (ReactNativeFeatureFlags::enableImagePrefetchingJNIBatchingAndroid()) { + if (ReactNativeFeatureFlags::enableImagePrefetchingJNIBatchingAndroid() && + commitHook_ != nullptr) { + commitHook_->invalidate(); if (auto uiManagerCommitHookManager = contextContainer_ ->find>( std::string(UIManagerCommitHookManagerKey)); uiManagerCommitHookManager.has_value()) { - (*uiManagerCommitHookManager)->unregisterCommitHook(*this); + (*uiManagerCommitHookManager)->unregisterCommitHook(*commitHook_); } + commitHook_ = nullptr; } } @@ -58,15 +92,6 @@ ImageRequest ImageFetcher::requestImage( return {imageSource, telemetry}; } -RootShadowNode::Unshared ImageFetcher::shadowTreeWillCommit( - const ShadowTree& /*shadowTree*/, - const RootShadowNode::Shared& /*oldRootShadowNode*/, - const RootShadowNode::Unshared& newRootShadowNode, - const ShadowTree::CommitOptions& /*commitOptions*/) noexcept { - flushImageRequests(); - return newRootShadowNode; -} - void ImageFetcher::flushImageRequests() { if (items_.empty()) { return; diff --git a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/android/react/renderer/imagemanager/ImageFetcher.h b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/android/react/renderer/imagemanager/ImageFetcher.h index 0bebb6f850151b..64bac04ba9c494 100644 --- a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/android/react/renderer/imagemanager/ImageFetcher.h +++ b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/android/react/renderer/imagemanager/ImageFetcher.h @@ -11,17 +11,19 @@ #include #include #include -#include #include +#include #include #include namespace facebook::react { -class ImageFetcher : public UIManagerCommitHook { +class ImageFetcherCommitHook; + +class ImageFetcher { public: ImageFetcher(std::shared_ptr contextContainer); - ~ImageFetcher() override; + ~ImageFetcher(); ImageFetcher(const ImageFetcher&) = delete; ImageFetcher& operator=(const ImageFetcher&) = delete; ImageFetcher(ImageFetcher&&) = delete; @@ -33,21 +35,12 @@ class ImageFetcher : public UIManagerCommitHook { const ImageRequestParams& imageRequestParams, Tag tag); - void commitHookWasRegistered(const UIManager& uiManager) noexcept override {} - - void commitHookWasUnregistered(const UIManager& uiManager) noexcept override { - } - - RootShadowNode::Unshared shadowTreeWillCommit( - const ShadowTree& shadowTree, - const RootShadowNode::Shared& oldRootShadowNode, - const RootShadowNode::Unshared& newRootShadowNode, - const ShadowTree::CommitOptions& commitOptions) noexcept override; - private: + friend class ImageFetcherCommitHook; void flushImageRequests(); std::unordered_map> items_; std::shared_ptr contextContainer_; + std::unique_ptr commitHook_; }; } // namespace facebook::react