为什么最近调用了 onAdDismissedFullScreenContent?

Why onAdDismissedFullScreenContent is being called lately?

我已经创建了一个函数来在显示另一个 activity 之前显示插页式广告。 它正在运行,但最近在关闭广告后 2-3 秒调用了 onAdDismissedFullScreenContent。它使先前的屏幕待机。 有机会重新点击按钮显示想要的 Activity.

我真的不知道如何解决这个问题。

这是我的代码:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                AdManager.showInterstitial(MainActivity.this, () -> {
                    Intent i = new Intent(MainActivity.this, MainActivity2.class);
                    startActivity(i);
                });
            }
        });
        AdManager.loadInterstitial(this);
    }
}

这是应用程序 Class:


public class App  extends Application {
    private static Context mContext;


    @Override
    public void onCreate() {
        super.onCreate();
        mContext = getApplicationContext();
        AdManager.Init(this);
    }

    public static Context getContext() {
        return mContext;
    }
}

AdManager Class:

public class AdManager {

    private static InterstitialAd mInterstitialAd;
    private static boolean loading, showing;


    public static void Init(Context context) {

        MobileAds.initialize(context, initializationStatus -> {
            loadInterstitial(context);
        });
    }


    public static void loadInterstitial(Context context) {

        if (context == null)
            context = App.getContext();

        Context finalContext = context;
        
        if (mInterstitialAd != null) {
            Toast.makeText(context,"already loaded",Toast.LENGTH_LONG).show();
            return;
        }
        if (loading) {
            Toast.makeText(context,"already another request is processing",Toast.LENGTH_LONG).show();
            return;
        }
        Toast.makeText(context,"requesting interstitial",Toast.LENGTH_LONG).show();

        loading = true;
        AdRequest adRequest = new AdRequest.Builder().build();

        InterstitialAd.load(context, "Interstial Ad Unit ID", adRequest, new InterstitialAdLoadCallback() {
            @Override
            public void onAdLoaded(@NonNull InterstitialAd interstitialAd) {
                mInterstitialAd = interstitialAd;
                Toast.makeText(finalContext,"ad loaded",Toast.LENGTH_LONG).show();
                loading = false;
            }

            @Override
            public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) {
                mInterstitialAd = null;
                loading = false;
                Toast.makeText(finalContext,"ad failed to load",Toast.LENGTH_LONG).show();
            }

        });
    }

    public static void showInterstitial(Activity activity, @NonNull AdListener listener) {
        
        if (showing) {
            Toast.makeText(activity,"already showing",Toast.LENGTH_LONG).show();
            listener.onCompleted();
            return;
        }

        if (mInterstitialAd != null) {
            showNow(activity, listener);

        } else {
            Toast.makeText(activity,"mInterstitialAd is null",Toast.LENGTH_LONG).show();
            listener.onCompleted();
            loadInterstitial(activity.getApplicationContext());
        }

    }

    private static void showNow(Activity activity, AdListener listener) {

        if (mInterstitialAd != null && !showing) {
            showing = true;
            mInterstitialAd.setFullScreenContentCallback(new FullScreenContentCallback() {
                @Override
                public void onAdDismissedFullScreenContent() {
                    Toast.makeText(activity,"Ad dismissed",Toast.LENGTH_LONG).show();
                    mInterstitialAd = null;
                    listener.onCompleted();
                    showing = false;
                    // times to load an new interstitial ad content
                    loadInterstitial(activity.getApplicationContext());
                }

                @Override
                public void onAdFailedToShowFullScreenContent(@NonNull AdError adError) {
                    Toast.makeText(activity,"AdFailedToShowFullScreenContent",Toast.LENGTH_LONG).show();
                    mInterstitialAd = null;
                    listener.onCompleted();
                    showing = false;

                    // times to load an new interstitial ad content
                    loadInterstitial(activity.getApplicationContext());
                }


            });
            //  Now show the ad
            Toast.makeText(activity,"call to show ad",Toast.LENGTH_LONG).show();
            mInterstitialAd.show(activity);
        } else {
            Toast.makeText(activity,"either mInterstitialAd is null or ad already is showing",Toast.LENGTH_LONG).show();
            listener.onCompleted();
        }
    }

        public interface AdListener {
        void onCompleted();
    }

}

请帮忙。

延迟问题


你真的无能为力。问题来自admob。这将会发生。但是,要了解更多信息,我们可以 post 关于 Google 问题跟踪器上的问题。

按键问题


我认为这不是什么艰巨的任务。只需按照以下步骤操作:

  1. 在按钮顶部的 xml 布局中创建一个 ProgressBar,并将其可见性设置为 gone

  2. 点击按钮显示广告时,可以设置按钮不可见,也可以设置进度条不可见

  3. 然后在延迟后,另一个 activity 打开而不会对来自 NullPointerException

    的 activity 造成任何伤害