Как правильно управлять жизненным циклом 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()
}
}
Вопросы
Можно ли избегать такого быстрого разрушения при каждом уничтожении Activity? Может быть, уничтожить рекламу только тогда, когда она не меняет конфигурацию?
Можно ли иметь обертку, которую я сделал?
Поскольку в нем говорится, что мне также следует избегать использования рекламы, которая не использовалась в течение часа с момента загрузки, что происходит с UnifiedNativeAdView, который использовал UnifiedNativeAd, когда я звоню
destroy
на UnifiedNativeAd? Можно ли позвонитьdestroy
на старом что использовали, при загрузке нового? Я хочу избежать удаления представления при загрузке нового...Поскольку в нем говорится, что на объявление может быть несколько ссылок, можно ли использовать один и тот же экземпляр UnifiedNativeAd в нескольких местах (разные действия)?
1 ответ
Насколько мне известно, я постараюсь подробно ответить на ваши вопросы.
- Уничтожение рекламы от
UnifiedNativeAdView
илиUnifiedNativeAd
неявно означает, что вы не сможете создавать другиеUnifiedNativeAdView
объекты больше не используют это объявление, и, если вы уничтожите оригиналUnifiedNativeAd
объект,UnifiedNativeAdView
который использует активы этогоUnifiedNativeAd
может вызывать исключение, зависать и т. д. Поведение этого в основном неизвестно, в зависимости от используемой вами рекламной сети.
Пока вы удаляете UnifiedNativeAdView
сам от своего родителя, утечки памяти не должно быть, и вы должны иметь возможность использовать загруженный экземпляр нативной рекламы для создания другого представления. Другой подход мог бы вызватьUnifiedNativeAdView.removeAllViews()
а затем удалить само представление из его родителя, но это может внутренне уничтожить UnifiedNativeAd
, и это то, чего я не знаю, вам нужно проверить это на себе.
Это зависит от того, чтобы не звонить
destroy()
на любом из классов может быть на ваше усмотрение, но в будущем они могут добавитьdestroy()
позвонить вUnifiedNativeAdView
сам объект (например, представлениеonDetachedFromWindow
метод). Поскольку нет функции, позволяющей узнать, уничтожено ли объявление с помощью такого метода, какisDestroyed()
, вы всегда должны пытаться создавать представления с помощью try-catch, я боюсь, что другого метода нет. Но пока этот подход не используется в самом SDK, все должно быть в порядке.Вы можете использовать
Stack<UnifiedNativeAd>
или что-то, на что можно разместить загруженную рекламу, и при созданииUnifiedNativeAdView
объект, вы можете позвонитьStack.pop()
чтобы вы знали, что уже использовали объявление, или объект больше не существует. Но вы не можете использовать то же самоеUnifiedNativeAdView
чтобы заменить показываемое вами собственное объявление, вам нужно создать новое. Это также означает, что вы можете загружать несколько нативных объявлений и в основном их хранить.
Также не стоит беспокоиться об уничтожении UnifiedNativeAd
сам объект после вызова destroy из UnifiedNativeAdView
поскольку он в любом случае внутренне уничтожает нативный объект объявления.
- Если нет внутренней ссылки на загруженный вами контекст, объявление хранится в
UnifiedNativeAd
объект, вы сможете использовать одно и то же объявление, раздувая разныеUnifiedNativeAdView
объекты для использования рекламы в различных целях, если вы гарантируете, что реклама не будет уничтожена. Однако я не рекомендую этот подход, так как показ одного и того же объявления дважды может нарушить правила или что-то в этом роде.
Это все, что я знаю, надеюсь, это поможет!