Как правильно управлять жизненным циклом UnifiedNativeAd Admob?

Задний план

Я пытаюсь реализовать поддержку нативной рекламы от Admob.

Эта проблема

Я заметил это требование:

Убедитесь, что все ссылки UnifiedNativeAd уничтожены в методе onDestroy() вашей операции.

В обратном вызове onUnifiedNativeAdLoaded обязательно уничтожьте все существующие нативные объявления, ссылки на которые будут разыменованы.

Однако я хочу предварительно загрузить рекламу еще до достижения Activity и, если возможно, повторно использовать рекламу, когда Activity воссоздается посредством изменения конфигурации (или, по крайней мере, при изменении ориентации). Возможно даже повторно использовать рекламу в нескольких местах, чтобы сократить время повторной загрузки.

Что я нашел

Я не смог найти объяснения по этому поводу, за исключением того, что это нормально для предварительной загрузки:

https://developers.google.com/admob/android/native/start?hl=en-US

В нем также говорится, что мы не должны использовать предварительно загруженную рекламу, которая не использовалась в течение часа:

Любые рекламные объекты, которые не отображались более часа, должны быть отброшены и заменены новыми объявлениями из нового запроса.

Что касается требования уничтожить объявление, когда на него нет ссылок, я поместил обертку объявления в кешированную ссылку, и, если она мне больше не нужна, я удаляю ее из кеша. Обертка должна избавиться от рекламы с помощьюfinalize, как таковой:

    class UnifiedNativeAdWrapper(private val ad: UnifiedNativeAd) {


        @UiThread
        fun getAd(): UnifiedNativeAd? {
            if (isDestroyed)
                return null
            return ad
        }

        @Suppress("MemberVisibilityCanBePrivate")
        var isDestroyed = false
            private set

        @Suppress("unused", "ProtectedInFinal")
        protected fun finalize() = destroy()

        @UiThread
        fun destroy() {
            if (isDestroyed)
                return
            isDestroyed = true
            ad.destroy()
        }
    }

Вопросы

  1. Можно ли избегать такого быстрого разрушения при каждом уничтожении Activity? Может быть, уничтожить рекламу только тогда, когда она не меняет конфигурацию?

  2. Можно ли иметь обертку, которую я сделал?

  3. Поскольку в нем говорится, что мне также следует избегать использования рекламы, которая не использовалась в течение часа с момента загрузки, что происходит с UnifiedNativeAdView, который использовал UnifiedNativeAd, когда я звоню destroyна UnifiedNativeAd? Можно ли позвонитьdestroyна старом что использовали, при загрузке нового? Я хочу избежать удаления представления при загрузке нового...

  4. Поскольку в нем говорится, что на объявление может быть несколько ссылок, можно ли использовать один и тот же экземпляр UnifiedNativeAd в нескольких местах (разные действия)?

1 ответ

Насколько мне известно, я постараюсь подробно ответить на ваши вопросы.

  1. Уничтожение рекламы от UnifiedNativeAdView или UnifiedNativeAd неявно означает, что вы не сможете создавать другие UnifiedNativeAdView объекты больше не используют это объявление, и, если вы уничтожите оригинал UnifiedNativeAd объект, UnifiedNativeAdView который использует активы этого UnifiedNativeAd может вызывать исключение, зависать и т. д. Поведение этого в основном неизвестно, в зависимости от используемой вами рекламной сети.

Пока вы удаляете UnifiedNativeAdViewсам от своего родителя, утечки памяти не должно быть, и вы должны иметь возможность использовать загруженный экземпляр нативной рекламы для создания другого представления. Другой подход мог бы вызватьUnifiedNativeAdView.removeAllViews() а затем удалить само представление из его родителя, но это может внутренне уничтожить UnifiedNativeAd, и это то, чего я не знаю, вам нужно проверить это на себе.

  1. Это зависит от того, чтобы не звонить destroy() на любом из классов может быть на ваше усмотрение, но в будущем они могут добавить destroy() позвонить в UnifiedNativeAdView сам объект (например, представление onDetachedFromWindowметод). Поскольку нет функции, позволяющей узнать, уничтожено ли объявление с помощью такого метода, какisDestroyed(), вы всегда должны пытаться создавать представления с помощью try-catch, я боюсь, что другого метода нет. Но пока этот подход не используется в самом SDK, все должно быть в порядке.

  2. Вы можете использовать Stack<UnifiedNativeAd> или что-то, на что можно разместить загруженную рекламу, и при создании UnifiedNativeAdView объект, вы можете позвонить Stack.pop()чтобы вы знали, что уже использовали объявление, или объект больше не существует. Но вы не можете использовать то же самоеUnifiedNativeAdViewчтобы заменить показываемое вами собственное объявление, вам нужно создать новое. Это также означает, что вы можете загружать несколько нативных объявлений и в основном их хранить.

Также не стоит беспокоиться об уничтожении UnifiedNativeAd сам объект после вызова destroy из UnifiedNativeAdView поскольку он в любом случае внутренне уничтожает нативный объект объявления.

  1. Если нет внутренней ссылки на загруженный вами контекст, объявление хранится в UnifiedNativeAd объект, вы сможете использовать одно и то же объявление, раздувая разные UnifiedNativeAdViewобъекты для использования рекламы в различных целях, если вы гарантируете, что реклама не будет уничтожена. Однако я не рекомендую этот подход, так как показ одного и того же объявления дважды может нарушить правила или что-то в этом роде.

Это все, что я знаю, надеюсь, это поможет!

Другие вопросы по тегам