Search code examples
androidsplash-screenadsinterstitial

How to show interstitial ad after loading the splash screen?


I'm in need of help, I'd like to display an interstitial add after the splash screen screen loads, but my code has an error.

Here is my code:

public class SplashScreenActivity extends AppCompatActivity {

    InterstitialAd mInterstitialAd;

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

        // FIREBASE INTERSTICIAL
        mInterstitialAd = new InterstitialAd(this);
        mInterstitialAd.setAdUnitId("ca-app-pub-2565065222479596/3931476543");

        mInterstitialAd.setAdListener(new AdListener() {
            @Override
            public void onAdClosed() {
                requestNewInterstitial();
            }
        });

        requestNewInterstitial();

        Toast.makeText(this,"* Necessário Acesso a Internet *",Toast.LENGTH_LONG).show();

        Thread timerThread = new Thread() {
            public void run() {
                try {
                    sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {

                    if (mInterstitialAd.isLoaded()) {
                        mInterstitialAd.show();
                        Intent intent = new Intent(SplashScreenActivity.this, MainActivity.class);
                        startActivity(intent);
                    }
                    else
                    {
                        Intent intent = new Intent(SplashScreenActivity.this, MainActivity.class);
                    }
                }

            }
        };
        timerThread.start();

    }

    // FIREBASE INTERSTICIAL
    private void requestNewInterstitial() {
        AdRequest adRequest = new AdRequest.Builder()
                .addTestDevice("SEE_YOUR_LOGCAT_TO_GET_YOUR_DEVICE_ID")
                .build();

        mInterstitialAd.loadAd(adRequest);
    }

}

after debugging the following is informed:

01-22 16:27:03.048 13840-13970/? E/AndroidRuntime: FATAL EXCEPTION: Thread-6
                                                   Process: idea.tisco.pepavideos, PID: 13840
                                                   java.lang.IllegalStateException: isLoaded must be called on the main UI thread.
                                                       at oc.b(:com.google.android.gms.DynamiteModulesA@11951448:20)
                                                       at com.google.android.gms.ads.internal.a.d(:com.google.android.gms.DynamiteModulesA@11951448:98)
                                                       at com.google.android.gms.ads.internal.client.ak.onTransact(:com.google.android.gms.DynamiteModulesA@11951448:14)
                                                       at android.os.Binder.transact(Binder.java:499)
                                                       at com.google.android.gms.internal.zzep$zza$zza.isReady(Unknown Source)
                                                       at com.google.android.gms.internal.zzfa.isLoaded(Unknown Source)
                                                       at com.google.android.gms.ads.InterstitialAd.isLoaded(Unknown Source)
                                                       at company.ts.SplashScreenActivity$2.run(SplashScreenActivity.java:50)

Even after the debug I could not understand the reason for the error.

I would like to just display an interstitial just after the splash screen or when I open the mainactivity.

Thank you so much!


Solution

  • the problem is herejava.lang.IllegalStateException: isLoaded must be called on the main UI thread.

    so may have to do this

     runOnUiThread(new Runnable() {
        @Override public void run() {
            if (mInterstitialAd.isLoaded()) {
              mInterstitialAd.show();
         }
        }
    });
    

    Possibly You have to call it with an activity reference, it depends from where Do You call

     mYourActivity.runOnUiThread(new Runnable() {
        @Override public void run() {
            if (mInterstitialAd.isLoaded()) {
              mInterstitialAd.show();
         }
        }
    });
    

    Source:AdMob Interstitial and error isLoaded must be called on the main UI thread