Java 在onAdClosed()方法中调用片段

Java 在onAdClosed()方法中调用片段,java,android,admob,Java,Android,Admob,我有一个奇怪的问题。当向用户显示间隙广告并用户将其关闭时,我正在调用方法onAdClosed()中的下一个片段。下面是我的代码 myInterstitialAd.setAdListener(new AdListener() { @Override public void onAdOpened() { // Code to

我有一个奇怪的问题。当向用户显示间隙广告并用户将其关闭时,我正在调用方法
onAdClosed()
中的下一个片段。下面是我的代码

myInterstitialAd.setAdListener(new AdListener() {

                            @Override
                            public void onAdOpened() {
                                // Code to be executed when the ad is displayed.

                            }

                            @Override
                            public void onAdClosed() {

                                FragmentManager fragmentManager = getActivity().getSupportFragmentManager();

                                FragmentTransaction transaction = fragmentManager.beginTransaction();
                                transaction.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out);
                                TestFragment newCustomFragment = new TestFragment();
                                transaction.replace(((ViewGroup) view.getParent()).getId(), newCustomFragment);
                                transaction.commit();

                            }
                        });
它在新API上运行良好,但我在API 19中遇到了一个问题。问题是ad关闭,但下一个片段不调用。在那之后,我将代码包装在一个处理程序中,这对我来说是有效的

@Override
                            public void onAdClosed() {

                               Handler handler_delete = new Handler();
                                handler_delete.postDelayed(new Runnable() {
                                    @Override
                                    public void run() {

                                        FragmentManager fragmentManager = getActivity().getSupportFragmentManager();

                                        FragmentTransaction transaction = fragmentManager.beginTransaction();
                                        transaction.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out);
                                        TestFragment newCustomFragment = new TestFragment();
                                        transaction.replace(((ViewGroup) view.getParent()).getId(), newCustomFragment);
                                        transaction.commit();

                                    }
                                }, 300);

                            }
                        });

问题解决了,但我有时会遇到非法的状态例外。我应该怎么做才能防止这种情况发生?

onSaveInstanceState
调用后
replace
fragment时抛出非法状态异常。你有两种方法来解决这个问题

  • 您可以使用
    committellowingstateloss
    而不是
    commit

  • 使您的
    Handler
    全局变量并调用
    Handler.removeCallbacksAndMessages(null)
    insde
    onPause
    删除当前片段执行
    replace