При прогрузке и появлении рекламного баннера падает FPS

Выглядит всё примерно так: https://youtu.be/mt2H_gm7n6c

В layout блок рекламы прописываю вот так:

<com.google.android.gms.ads.AdView
    xmlns:ads="http://schemas.android.com/apk/res-auto"
    android:id="@+id/adView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    ads:adSize="BANNER"
    ads:adUnitId="@string/banner_ad_unit_id">
</com.google.android.gms.ads.AdView>

Потом просто нахожу его в методе onCreate второй активности и гружу рекламу:

AdView mAdView = findViewById(R.id.adView);
AdRequest adRequest = new AdRequest.Builder().addTestDevice("2792B4EC7E5401859768008706660001").build();
mAdView.loadAd(adRequest);
mAdView.setVisibility(View.VISIBLE);

Лаги, в виде потери кадров и замедления анимации, замечены на устройствах с API>=21, то есть новее, чем Android Marshmallow. Использую последние библиотеки и CompileSDK.

Реклама - AdMob из библиотеки com.google.android.gms.ads.

Вопрос следующий: почему лагает, и как это исправить?


Ответы (1 шт):

Автор решения: sanmai

Эта известная проблема, которая много раз обсуждалась в сети, достаточно поискать по словам "admob fps drop" и тому подобным.

Корень проблемы здесь, скорее всего, в том, что для запуска AdMob требуются существенные ресурсы, из-за чего анимация начинает буксовать. В качестве одного решения можно показывать рекламу с некоторой задержкой:

Handler handler = new Handler();
handler.postDelayed(new Runnable() {
     @Override
     public void run() {
          AdRequest bannerRequest = new AdRequest.Builder().build();
          mAdView.loadAd(bannerRequest);
     }
}, 2000);

Отчёт о таком решении похожей проблемы. И ещё один.

Можно сделать задержку не фиксированную, а привязать её к действиям пользователя. Например, начинать загружать рекламу через мгновение после того как пользователь перестал прокручивать экран.

Другим решением предлагается отключать ускорение графики для рекламы, манипулируя свойством LAYER_TYPE_SOFTWARE.

adView.setAdListener(new AdListener() {
    @Override
    public void onAdLoaded() {
        runOnWebView(mAdView, new WebViewAction() {
            @Override
            public void run(WebView view) {
                // the most important part is here
                view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
            }
        });
    }
});

Аналогично можно выключить ускорение для какой-то Activity:

<activity android:hardwareAccelerated="false" />

Понятно что такое действие может категорически негативно сказаться на сроке службы батареи при использовании вашего приложения, но если проблема будет решена, то может быть оно того стоит? Решать вам.

→ Ссылка