yandexmobile / yandex-ads-sdk-android

Other
80 stars 22 forks source link

SDK API usage from a background thread detected. Please, use SDK API just from the main thread. (5.5.0) #182

Closed DjentAgent closed 1 year ago

DjentAgent commented 1 year ago

После обновления до 5.5.0 с 5.4.1 получаю следующую ошибку :

FATAL EXCEPTION: pool-22-thread-3 Process: com.appblockgames.freecraftexploration, PID: 2681 com.yandex.mobile.ads.impl.o40: SDK API usage from a background thread detected. Please, use SDK API just from the main thread. at com.yandex.mobile.ads.impl.h70.a(SourceFile:3) at com.yandex.mobile.ads.interstitial.InterstitialAd.(SourceFile:4) com.project.sample.ads.yandex.YandexAdsInterstitial.onLoadAd(YandexAdsInterstitial.java:40)

Бэкграунд треды для рекламы не создавали.

`public class YandexAdsInterstitial extends AbstractInterstitial {

private static final String TAG = YandexAdsInterstitial.class.getSimpleName();
private static final String YANDEX_ADS_INTERSTITIAL_TEST_ID = "R-M-DEMO-interstitial";
private static YandexAdsInterstitial instance;
private InterstitialAd mInterstitialAd;
private boolean isLoading = false;

public YandexAdsInterstitial() {
}

@Override
public void onLoadAd(Context activityContext) {
    if (Config.REMOVE_ADS || SubscriptionManager.isSubscriptionActivated() || AdMobManager.getInstance().isAdMobEnabled()) return;
    if(!isLoading) {
        mInterstitialAd = new InterstitialAd(App.getContext());
        mInterstitialAd.setAdUnitId(BuildConfig.DEBUG ? YANDEX_ADS_INTERSTITIAL_TEST_ID : YANDEX_ADS_INTERSTITIAL_ID);
        final AdRequest adRequest = new AdRequest.Builder().build();
        mInterstitialAd.setInterstitialAdEventListener(new InterstitialAdEventListener() {
            @Override
            public void onAdLoaded() {
                isLoading = false;
            }

            @Override
            public void onAdFailedToLoad(AdRequestError adRequestError) {
                isLoading = false;
            }

            @Override
            public void onAdShown() {
                onLoadAd(activityContext);
            }

            @Override
            public void onAdDismissed() {
            }

            @Override
            public void onAdClicked() {

            }

            @Override
            public void onLeftApplication() {
            }

            @Override
            public void onReturnedToApplication() {
            }

            @Override
            public void onImpression(@Nullable @org.jetbrains.annotations.Nullable ImpressionData impressionData) {

            }
        });

        isLoading = true;
        mInterstitialAd.loadAd(adRequest);
    }
}

@Override
public void onShowAd(Activity activity) {
    if(mInterstitialAd!=null && mInterstitialAd.isLoaded()) {
        mInterstitialAd.show();
    }
}

}`

mobile-ads-github commented 1 year ago

Добрый день, мы валидируем вызов с главного потока с помощью следующей проверки: Thread.currentThread() == Looper.getMainLooper().thread. Если данное условие false, то метод вашего приложения onLoadAd вызывается не с главного потока. Провалидируйте пожалуйста, что это условие проходит в вашем приложении на вызов onAdLoaded.

DjentAgent commented 1 year ago

Thread.currentThread() == Looper.getMainLooper().thread

image Вот, как видите, в дебаге все прекрасно заходит с таким условием. Что еще проверить?

mobile-ads-github commented 1 year ago

Спасибо. Вызов метода onAdLoad(context: Context) в коде вашего приложения происходит только из метода onYandexAdsInitialized()? Проверьте это пожалуйста добавив следующий assert прямо перед созданием объекта InterstitialAd: assert(Thread.currentThread() == Looper.getMainLooper().getThread()); mInterstitialAd = new InterstitialAd(App.getContext());

Также по возможности пришлите полный stacktrace возникающего из InterstitialAd крэша, включающий элементы stacktrace от самого старта потока.

DjentAgent commented 1 year ago

А не может быть проблема в том, что загрузка интерстишиала начинается после коллбека от объекта, который инициализирует библиотеку? Коллбек, как я понимаю, может и не в главном потоке отработать? image

mobile-ads-github commented 1 year ago

Да, в данный момент коллбэк завершения инициализации SDK может отрабатывать не на главном потоке. Мы поправим эту логику в SDK перенеся коллбэк строго на главным поток. Спасибо!

Пока мы не поправили проблему в SDK, реализуйте пожалуйста в приложении перевод вызова onAdLoad на главный поток.

DjentAgent commented 1 year ago

Спасибо! Будем ждать обновления, пока полечим через new Handler(Looper.getMainLooper()).

Я правильно понимаю, что эта проверка на главный поток только для интерстишиалов?

mobile-ads-github commented 1 year ago

Проверка на вызов API SDK с главного потока была добавлена для всех форматов рекламы. Проверка отрабатывает только в Debug сборке приложения, в Release сборке проверка отключается.

mobile-ads-github commented 1 year ago

Добрый день, исправили проблему в релизе 5.5.1.

valery-lavrik commented 1 year ago

Версия 5.6.0 - ошибка осталась