만족

[Android] 전면 광고가 로딩되었음에도 표시되지 않는 현상 본문

[Android] 전면 광고가 로딩되었음에도 표시되지 않는 현상

FrontEnd/Android Satisfaction 2023. 2. 21. 02:49

전면 광고가 성공적으로 로딩되었음에도 로딩되지 않는 현상이 포착되었다.

 

조건 만족 시 전면 광고 로딩이 실패하거나 표시된 후 다음 동작이 실행되었기 때문에 매우 치명적인 문제였다.

 

오류 설명

코드에서는 전면 광고를 담당하는 로직을 분리해 별도의 클래스에서 관리하고 있었다.

 

  public void load(Context context) {
    mInterstitialAd = new InterstitialAd(context);
    if (BuildConfig.DEBUG_MODE) {
      mInterstitialAd.setAdUnitId("ca-app-pub-3940256099942544/1033173712");
    } else {
      mInterstitialAd.setAdUnitId("AD_UNIT_ID");
    }
    
    mInterstitialAd.loadAd(new AdRequest.Builder().build());
    
    mInterstitialAd.setAdListener(new AdListener() {
      @Override
      public void onAdFailedToLoad(int i) {
        super.onAdFailedToLoad(i);
        //retry
        load(context);
      }
    });
    
    showedFullsizeAd = false;
    showingFullsizeAd = false;
    initTime = System.currentTimeMillis();
  }

 

load 메서드는 광고를 초기화하고 로딩을 시작한다.

 

 public void showFullsizeAd(Context context, @Nullable Runnable callback) {
    if (!mInterstitialAd.isLoaded()) {
      //아직 전면 광고가 로딩되지 않음
      if (onClose != null) {
        onClose.run();
      }
      return;
    }
    mInterstitialAd.setAdListener(new AdListener() {
      
      @Override
      public void onAdFailedToLoad(int i) {
        super.onAdFailedToLoad(i);
        
        load(context);
        if (onClose != null) {
          onClose.run();
        }
      }
      
      @Override
      public void onAdOpened() {
        super.onAdOpened();
        
        showedFullsizeAd = true;
        showingFullsizeAd = true;
      }
      
      @Override
      public void onAdClosed() {
        super.onAdClosed();
        
        showingFullsizeAd = false;
        if (onClose != null) {
          onClose.run();
        }
      }
    });
    mInterstitialAd.show();
    
 }

이후 show메서드에서는 광고가 로딩된 상태라면 표시하고 닫힌 후 콜백을 표시한다.

 

만약 실패했다면 콜백을 실행하고 다시 load메서드를 실행한다.

 

그런데, 다시 load 메서드가 호출된 후(내 경우 30분마다 load를 호출하도록 했다) 부터는 loaded된 상태에서도

mInterstitialAd.show() 메서드가 호출되어도 광고가 표시되지 않는 경우가 빈번했다.

 

mInterstitialAd.show()를 try-catch로 감싸도 exception은 발생하지 않았다.

원인은 무엇인가?

예외가 발생하는 것도 아니라, 정확한 원인은 알 수 없다.

 

다만 로그에 '이미 초기화되었다'는 메시지가 표시되었다.

 

d로그가 아닌 i로그였기에 대수롭게 생각하지 않았지만,

뭔가 의심스러워 mInterstitialAd객체 생성과 unitId 설정 부분은 한 번만 실행하도록 변경했다.

 

  public void load(Context context) {
    // mInterstitialAd를 처음 생성할 때만 unit id 설정
    if (mInterstitialAd == null) {
      mInterstitialAd = new InterstitialAd(context);
      if (BuildConfig.DEBUG_MODE) {
        mInterstitialAd.setAdUnitId("ca-app-pub-3940256099942544/1033173712");
      } else {
        mInterstitialAd.setAdUnitId("AD_UNIT_ID");
      }
    }
    mInterstitialAd.loadAd(new AdRequest.Builder().build());
    
    mInterstitialAd.setAdListener(new AdListener() {
      @Override
      public void onAdFailedToLoad(int i) {
        super.onAdFailedToLoad(i);
        //retry
        load(context);
      }
    });
  }

 

이렇게 하고 10초에 한번 load를 호출하도록 변경해서 테스트해보면,

정상적으로 광고가 표시된다.

 

왜 이런 문제가 발생하는지 코드를 까 보고 싶었지만 

주요 변수, 메서드 외에는 난독화되어 있어 어려울 것 같다...

 

 



Comments