Проблема производительности PublisherAdView loadAd на Android

У меня были некоторые проблемы с производительностью приложения (рендеринг пользовательского интерфейса на мгновение зависал), я немного покопался и обнаружил, что метод PublisherAdView.loadAd() занимает около 500-700 мс для выполнения на Nexus 5 при холодном запуске приложения и 100-200 мс при последующих запусках. . Я ожидал 10-15 мс в худшем случае.

Чтобы убедиться в этом, я скачал пример баннера отсюда: https://developers.google.com/mobile-ads-sdk/docs/dfp/android/banner и изменил MainActivity для выполнения метода loadAd() в отдельном методе:

private PublisherAdView mAdView;
private PublisherAdRequest adRequest;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my);

    mAdView = (PublisherAdView) findViewById(R.id.ad_view);

    adRequest = new PublisherAdRequest.Builder().build();

    loadAd();
}

 private void loadAd(){

    long start = System.currentTimeMillis();

    // Start loading the ad in the background.
    mAdView.loadAd(adRequest);

    long end = System.currentTimeMillis();

    Log.d("MyActivity", "loadAd took "+(end - start)+" ms");
}

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

Это также проблема при показе рекламы в RecyclerView, и пользовательский интерфейс зависает во время прокрутки, пока реклама не загрузится.

Я что-то упустил или это действительно проблема PublisherAdView?


person Esed    schedule 16.06.2016    source источник


Ответы (1)


У меня есть аналогичный опыт, AdMob использует веб-просмотры под капотом, что ужасно неэффективно на устройствах Android и нагружает процессор. Первоначально долгое время загрузки связано с подключением Android к плагину Chromium для запуска сеанса веб-просмотра. Однажды в памяти это улучшится. Это наиболее заметно при использовании в представлениях списков/переработчиков.

Подход, который я использую, заключается в отображении баннеров один раз во фрагментах и ​​действиях. Обновление настраивается на стороне рекламного сервера. Я бы не стал вставлять рекламу в списки (например, вставлять рекламу в каждый n-й элемент), но если необходимо, запишите флаг, используя view.setTag, чтобы указать, что реклама была загружена.

Этот флаг на самом деле может быть временем загрузки объявления. Затем используйте этот тег в своем bindViewHolder вашего recyclerview или getItem в обычном listView, чтобы определить, было ли загружено объявление. Если объявление уже было загружено, просто отобразите текущее содержимое/макет, в противном случае, если срок его действия истек (на какое-то произвольное время, например 30 секунд), или значение не установлено, то отправьте запрос loadAd), но тогда вы снова получить удар по производительности.

Таким образом, когда пользователь прокручивает страницу, производительность прокрутки постепенно улучшается, поскольку вы не запрашиваете рекламу каждый раз, когда создается экземпляр элемента списка. Кроме того, при использовании фрагментов убедитесь, что вы используете PublisherAdView.pause() для своего объявления, если это фрагмент, особенно если он находится на странице просмотра во время onDestroyView.

person angryITguy    schedule 12.09.2016