【问题标题】:How to properly handle the lifecycle of Admob's UnifiedNativeAd?如何正确处理 Admob 的 UnifiedNativeAd 的生命周期?
【发布时间】:2020-07-23 11:18:20
【问题描述】:

背景

我正在尝试实现对 Admob 原生广告的支持。

问题

我注意到this requirement:

确保所有 UnifiedNativeAd 引用都在您的 Activity 的 onDestroy() 方法。

在您的 onUnifiedNativeAdLoaded 回调中,确保销毁任何 将被取消引用的现有原生广告。

但是,我想在到达 Activity 之前预加载广告,并且如果可能的话,在通过配置更改(或至少在方向更改)重新创建 Activity 时重新使用广告。甚至可以在多个地方重复使用广告,以减少重新加载的时间。

我发现了什么

我找不到关于这个的解释,除了可以预加载:

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

它还说我们不应该使用预加载且一小时未使用的广告:

任何已持有超过一小时的广告对象 正在展示的广告应该被丢弃并替换为来自 新请求。

关于在没有引用广告时销毁广告的要求,我已将广告的包装放入缓存引用中,如果不再需要它,我会将其从缓存中删除。包装器应该使用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. 既然它说我还应该避免使用加载后一小时未使用的广告,那么一旦我在 UnifiedNativeAd 上调用 destroy,使用 UnifiedNativeAd 的 UnifiedNativeAdView 会发生什么情况?可以在加载新的时在使用的旧的上调用 destroy 吗?我想避免在加载新视图时删除视图...

  4. 既然它说可能有多个对广告的引用,那么同一个 UnifiedNativeAd 实例可以在多个地方(不同的活动)使用吗?

【问题讨论】:

    标签: android admob native-ads unifiednativeadview


    【解决方案1】:

    据我所知,我将尝试广泛回答您的问题。

    1. UnifiedNativeAdViewUnifiedNativeAd 销毁广告隐含意味着您将无法再使用该广告创建其他UnifiedNativeAdView 对象,如果您销毁原始UnifiedNativeAd 对象,UnifiedNativeAdView使用此 UnifiedNativeAd 的资产可能会引发异常、冻结等...其行为大多是未知的,具体取决于您使用的广告网络。

    只要您将UnifiedNativeAdView 本身从其父级中移除,就不会发生内存泄漏,并且您应该能够使用加载的原生广告实例来创建另一个视图。另一种方法可能是调用UnifiedNativeAdView.removeAllViews(),然后将视图本身从其父级中删除,但这可能会在内部破坏UnifiedNativeAd,这是我不知道的,您需要自己测试它。

    1. 这取决于,确保不对任何一个类调用 destroy() 可能取决于您,但将来,他们可能会在 UnifiedNativeAdView 对象本身上添加 destroy() 调用(例如,视图的 @ 987654333@ 方法)。由于没有使用isDestroyed()之类的方法查看广告是否被销毁的功能,因此您应该始终尝试在try-catch下创建视图,恐怕没有其他方法。但是,只要 SDK 本身不使用这种方法,就应该没问题。

    2. 您可以使用Stack<UnifiedNativeAd> 或其他东西来放置加载的广告,并且在创建UnifiedNativeAdView 对象时,您可以调用Stack.pop(),这样您就知道您已经使用了广告或者该对象不存在了。但是,您不能使用相同的UnifiedNativeAdView 来替换您正在展示的原生广告,您必须创建一个新广告。这也意味着您基本上可以加载多个原生广告并存储它们。

    此外,您不必担心在从UnifiedNativeAdView 调用destroy 后销毁UnifiedNativeAd 对象本身,因为它无论如何都会在内部销毁原生广告对象。

    1. 除非有对您加载的上下文的内部引用,否则广告保存在 UnifiedNativeAd 对象中,您应该能够通过膨胀不同的 UnifiedNativeAdView 对象来使用相同的广告,以便在不同的活动中使用广告,如只要您确保广告不被破坏。但是,我不推荐这种方法,因为两次展示同一个广告可能会违反政策或其他问题。

    我知道的就这些了,希望对你有帮助!

    【讨论】:

    • 1.你测试了吗?它甚至应该适用于有视频的原生广告?如果我在当前活动的方向改变时重新使用一个有视频、播放了一点的视频会发生什么?您使用哪种方法? 2. 如果他们添加它,它不会让我重复使用你在#1 上写的内容,不是吗? 3. 所以我每次使用新广告时都必须重新充气?
    • @androiddeveloper 1. 是的,只要你不破坏UnifiedNativeAd或UnifiedNativeAdView,方向改变或活动重建只是暂停视频,然后在重新创建活动后,你可以使用相同的视频在其他 UnifiedNativeAdView 对象中。 2. 这基本上就是它的要点,是的。不过,目前您可以使用它。 3. 是的。
    • 1.你在你的 app/s 上做吗?这意味着您避免在方向更改时销毁广告?
    • @androiddeveloper 1. 是的,我已经在我的应用程序上做了很多次,现在还在做。而且,这确实意味着我避免在方向更改时销毁它,并且仅在用户退出应用程序或离开屏幕时才销毁它。
    • 我并没有真正尝试过不删除视图,但是方向更改意味着视图会在重新创建活动后被删除,除非您在清单中明确指定 configChanges 属性。我认为在你的情况下这并不重要,只要你保留 UnifiedNativeAd 对象而不破坏它,你应该能够重新使用它。
    猜你喜欢
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 2012-10-14
    • 1970-01-01
    相关资源
    最近更新 更多