При прогрузке и появлении рекламного баннера падает 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 шт):
Эта известная проблема, которая много раз обсуждалась в сети, достаточно поискать по словам "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" />
Понятно что такое действие может категорически негативно сказаться на сроке службы батареи при использовании вашего приложения, но если проблема будет решена, то может быть оно того стоит? Решать вам.