0

I have a very weird expception happening on my app.

I overwrote the onBackPressed of some of my activities in order to show an intertitial ad. the code is very simple

public void onBackPressed() {
        if (showIntertitialAd())
            //pseudocodehere
           show ad
            ... on close -> super.onBackPressed();

        else
            super.onBackPressed();
    }

however, somehow im gettng IllegalStateException in some cases here is the stacktrace

Caused by java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
       at android.app.FragmentManagerImpl.checkStateLoss(FragmentManagerImpl.java:1413)
       at android.app.FragmentManagerImpl.popBackStackImmediate(FragmentManagerImpl.java:576)
       at android.app.Activity.onBackPressed(Activity.java:2507)
       at androidx.activity.ComponentActivity.access$001(ComponentActivity.java:53)
       at androidx.activity.ComponentActivity$1.run(ComponentActivity.java:77)
       at androidx.activity.OnBackPressedDispatcher.onBackPressed(OnBackPressedDispatcher.java:197)
       at androidx.activity.ComponentActivity.onBackPressed(ComponentActivity.java:314)
       at com.tomatedigital.adinjector.AdsAppCompatActivity.access$001(AdsAppCompatActivity.java:50)
       at com.tomatedigital.adinjector.AdsAppCompatActivity$OnBackPressededReward.onRewarded(AdsAppCompatActivity.java:542)
       at com.tomatedigital.adinjector.listener.InterstitialAdListener.onAdClosed(InterstitialAdListener.java:40)
       at com.google.android.gms.internal.ads.zzuf.onAdClosed(zzuf.java:4)
       at com.google.android.gms.internal.ads.zzvp.zza(zzvp.java:4)
       at com.google.android.gms.internal.ads.zzgk.onTransact(zzgk.java:13)
       at android.os.Binder.transact(Binder.java:387)
       at fj.b(fj.java:2)
       at com.google.android.gms.ads.internal.client.ag.a(ag.java:1)
       at com.google.android.gms.ads.internal.zzk.n(zzk.java:2)
       at com.google.android.gms.ads.internal.aq.n(aq.java)
       at com.google.android.gms.ads.internal.g.D(g.java)
       at com.google.android.gms.ads.internal.aq.D(aq.java:1)
       at com.google.android.gms.ads.internal.overlay.k.n(k.java:5)
       at com.google.android.gms.ads.internal.overlay.k.m(k.java:6)
       at com.google.android.gms.ads.internal.overlay.k.e(k.java:3)
       at com.google.android.gms.ads.internal.overlay.client.b.a(b.java:13)
       at fk.onTransact(fk.java:4)
       at android.os.Binder.transact(Binder.java:387)
       at com.google.android.gms.internal.ads.zzgi.zza(zzgi.java:21)
       at com.google.android.gms.internal.ads.zzapi.onPause(zzapi.java:17)
       at com.google.android.gms.ads.AdActivity.onPause(AdActivity.java:40)
       at android.app.Activity.performPause(Activity.java:6356)
       at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1334)
       at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3388)
       at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3361)
       at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3336)
       at android.app.ActivityThread.-wrap13(ActivityThread.java)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1372)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:148)
       at android.app.ActivityThread.main(ActivityThread.java:5443)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

how can i solve it?

Rafael Lima
  • 3,079
  • 3
  • 41
  • 105
  • Check if this helps : https://stackoverflow.com/questions/7575921/illegalstateexception-can-not-perform-this-action-after-onsaveinstancestate-wit – raxerz Jun 12 '20 at 13:14

2 Answers2

1

It seems that your activity is sometimes paused when you call onBackPressed() because of the ad, even though you have the "on close" pseudo code. onBackPressed() can't be called when activity is on pause.

Have you tried using finish() in this case? If your intention is to close the current activity/fragment, that could work as well.

Pedro Rocha
  • 154
  • 6
-1

To Avoid crash on back press just modify the code. As well as you can get the actual exception on the log and can modify your code. However, It will not crash your application.

    public void onBackPressed() {

    try{
    if (showIntertitialAd())
                //pseudocodehere
               show ad
                ... on close -> super.onBackPressed();

            else
                super.onBackPressed();
    }catch(Exception ex){
    Log.e(ex.localizedmessage)
super.onBackPressed();
    }
        }
Pawan Soni
  • 860
  • 8
  • 19