【问题标题】:interstitial error android unable to pause activity插页式错误android无法暂停活动
【发布时间】:2014-03-21 05:09:49
【问题描述】:

我对插页式广告有一个问题。 当我尝试处理 onAdClosed() 方法时出现错误,无法暂停活动

这里我用的是片段

我在这里发布我的 logcat 输出

03-18 19:28:50.169: E/AndroidRuntime(26349): FATAL EXCEPTION: main
03-18 19:28:50.169: E/AndroidRuntime(26349): java.lang.RuntimeException: Unable to pause  
activity {com.social_sweep.app/com.google.android.gms.ads.AdActivity}:
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

03-18 19:28:50.169: E/AndroidRuntime(26349):at
android.app.ActivityThread.performPauseActivity(ActivityThread.java:2846)

03-18 19:28:50.169: E/AndroidRuntime(26349): at
android.app.ActivityThread.performPauseActivity(ActivityThread.java:2802)
03-18 19:28:50.169: E/AndroidRuntime(26349): at
android.app.ActivityThread.handlePauseActivity(ActivityThread.java:2780)
03-18 19:28:50.169: E/AndroidRuntime(26349):at
android.app.ActivityThread.access$800(ActivityThread.java:133)
 03-18 19:28:50.169: E/AndroidRuntime(26349):at
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1220)
03-18 19:28:50.169: E/AndroidRuntime(26349):at
android.os.Handler.dispatchMessage(Handler.java:99)
03-18 19:28:50.169: E/AndroidRuntime(26349):    at
android.os.Looper.loop(Looper.java:137)
03-18 19:28:50.169: E/AndroidRuntime(26349):    at
android.app.ActivityThread.main(ActivityThread.java:4794)
03-18 19:28:50.169: E/AndroidRuntime(26349):    at
java.lang.reflect.Method.invokeNative(Native Method)
03-18 19:28:50.169: E/AndroidRuntime(26349):    at
java.lang.reflect.Method.invoke(Method.java:511)
03-18 19:28:50.169: E/AndroidRuntime(26349):    at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
03-18 19:28:50.169: E/AndroidRuntime(26349):    at
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
03-18 19:28:50.169: E/AndroidRuntime(26349):    at
dalvik.system.NativeStart.main(Native Method)
03-18 19:28:50.169: E/AndroidRuntime(26349): Caused by: java.lang.IllegalStateException:
Can not perform this action after onSaveInstanceState
03-18 19:28:50.169: E/AndroidRuntime(26349):    at
android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1280)
03-18 19:28:50.169: E/AndroidRuntime(26349):    at
android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1291)
03-18 19:28:50.169: E/AndroidRuntime(26349):    at
android.app.BackStackRecord.commitInternal(BackStackRecord.java:548)
03-18 19:28:50.169: E/AndroidRuntime(26349):    at
android.app.BackStackRecord.commit(BackStackRecord.java:532)
03-18 19:28:50.169: E/AndroidRuntime(26349):    at
com.social_sweep.app.SelectEvent$3$1.onAdClosed(SelectEvent.java:461)
03-18 19:28:50.169: E/AndroidRuntime(26349):    at
com.google.android.gms.internal.t.onAdClosed(Unknown Source)
03-18 19:28:50.169: E/AndroidRuntime(26349):    at
com.google.android.gms.internal.ab$a.onTransact(Unknown Source)
03-18 19:28:50.169: E/AndroidRuntime(26349):    at
android.os.Binder.transact(Binder.java:326)
android.os.Binder.transact(Binder.java:326)
03-18 19:28:50.169: E/AndroidRuntime(26349):    at
com.google.android.gms.internal.bs$a$a.onPause(Unknown Source)
03-18 19:28:50.169: E/AndroidRuntime(26349):    at
com.google.android.gms.ads.AdActivity.onPause(Unknown Source)
03-18 19:28:50.169: E/AndroidRuntime(26349):    at
android.app.Activity.performPause(Activity.java:5219)
03-18 19:28:50.169: E/AndroidRuntime(26349):    at
android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1225)
03-18 19:28:50.169: E/AndroidRuntime(26349):    at
android.app.ActivityThread.performPauseActivity(ActivityThread.java:2833)
03-18 19:28:50.169: E/AndroidRuntime(26349):    ... 12 more

这是我正在做的代码,

 if (fragment != null) {
             interstitial.setAdListener(new AdListener() {

             public void onAdLoaded() {

             displayInterstitial();

             }

             public void onAdClosed() {
            FragmentManager fragmentManager = getFragmentManager();
            fragmentManager
                    .beginTransaction()
                    .setCustomAnimations(R.animator.slide_in_left,
                            R.animator.slide_out_right,
                            R.animator.slide_in_left,
                            R.animator.slide_out_right)
                    .replace(R.id.frame_container, fragment)..commitAllowingStateLoss();

            // update selected item and title, then close the
            // drawer

            getActivity().getActionBar().setTitle(Title);
             };

             });

提前致谢。

【问题讨论】:

  • 你有没有设法克服这个错误

标签: android android-fragments admob android-fragmentactivity


【解决方案1】:

您遇到的错误是由于您在 Activity 上调用 #onSaveInstanceState 之后尝试执行片段操作。即您的 Activity 已停止并可能被销毁,这无疑是因为 Ad Activity 已显示。当广告关闭时,您的 Activity 将重新启动(甚至可能重新创建),因此此时可以进行任何您想要的 UI 操作。

附注:

请勿从 AdListener#onAdLoaded 调用 displayInterstitial。

这将提供非常糟糕的用户体验,并在您最不期望的时候(例如在您的 Activity 存在之后)显示广告,从而导致您出现大量问题。

而是在应用的自然断点处调用 DisplayInterstitial。

【讨论】:

  • 感谢您的回答和指导,您能告诉我展示广告的正确方法吗?我在执行后的方法中使用 asynctask 我正在展示广告
  • 只需在应用的自然断点处调用#displayInterstitial,例如在游戏关卡之间。
  • 好的,我做到了,但是在#onAdClosed() 如何恢复导致错误的活动
  • 只需从 onAdClosed 中删除您的代码 - 它不会从那里工作,我不明白您想用它做什么。你想用这段代码解决什么问题?
  • 我想在用户关闭广告时替换片段\
【解决方案2】:

在 onAdClosed() 中添加此代码:-

if(!isAdded()) { return; }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    相关资源
    最近更新 更多