java.lang.IllegalStateException:onSaveInstanceState On Activity Backpress 后无法执行此操作(不使用任何片段)

Posted

技术标签:

【中文标题】java.lang.IllegalStateException:onSaveInstanceState On Activity Backpress 后无法执行此操作(不使用任何片段)【英文标题】:java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState On Activity Backpress (Not using any fragment) 【发布时间】:2017-08-11 21:01:54 【问题描述】:

在我的应用程序中,我收到 java.lang.IllegalStateException:在 onSaveInstanceState 之后无法执行此操作。在Activity的onBackPress()之后。

Fatal Exception: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
       at android.support.v4.app.FragmentManagerImpl.checkStateLoss(MyApplication:1533)
       at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(MyApplication:603)
       at android.support.v4.app.FragmentActivity.onBackPressed(MyApplication:179)
       at com.app.mobile.views.NewsActivity.onBackPressed(MyApplication:301)
       at com.app.mobile.views.NewsActivity.onOptionsItemSelected(MyApplication:293)
       at android.app.Activity.onMenuItemSelected(Activity.java:2625)
       at android.support.v4.app.FragmentActivity.onMenuItemSelected(MyApplication:406)
       at android.support.v7.app.AppCompatActivity.onMenuItemSelected(MyApplication:195)
       at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(MyApplication:103)
       at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(MyApplication:103)
       at android.support.v7.widget.ToolbarWidgetWrapper$1.onClick(MyApplication:183)
       at android.view.View.performClick(View.java:4446)
       at android.view.View$PerformClick.run(View.java:18437)
       at android.os.Handler.handleCallback(Handler.java:733)
       at android.os.Handler.dispatchMessage(Handler.java:95)
       at android.os.Looper.loop(Looper.java:136)
       at android.app.ActivityThread.main(ActivityThread.java:5447)
       at java.lang.reflect.Method.invokeNative(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:515)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:970)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:786)
       at dalvik.system.NativeStart.main(NativeStart.java)

在我的活动中,我没有使用任何片段。我搜索了解决方案,但只找到了片段。

在我的代码中。

@Override
  public boolean onOptionsItemSelected(MenuItem item) 

    switch (item.getItemId()) 
      case android.R.id.home:
        onBackPressed();
        return true;
    
    return super.onOptionsItemSelected(item);
  

 @Override
  public void onBackPressed() 
    super.onBackPressed();
    if (screen_Name != 0 && screen_Name == Constants.TAG_WIDGET_SCREEN) 
      int tagID = getIntent().getIntExtra(Constants.TAG_ID, -1);
      int tagcount = getIntent().getIntExtra(Constants.TAG_COUNT, 0);
      if (tagcount > 0) 
        mDBAdapter.updateTagCountToZero(tagID);
      
      PreferenceUtils.getInstance(NewsActivity.this).remove(Constants.NEWS + type);
      PreferenceUtils.getInstance(NewsActivity.this).remove(Constants.CARD_PREF + cardPref);

    
  

在 onSavedInstance 中

@Override
  protected void onSaveInstanceState(Bundle outState) 

    if (feedList != null && feedList.size() > 0) 
      outState.putSerializable(FEED_DATA, feedList);
    
    stopProgressBar(); // stopping progress dialog
    super.onSaveInstanceState(outState);
  

请帮助如何处理这种情况。

【问题讨论】:

我只是随机猜测,但您是否尝试将super.onBackPressed(); 放在方法的末尾?也许这已经触发了类似 onSaveInstanceState 但这不是复制的。这是在现场 apk 中出现的。所以我不知道确切的原因。 【参考方案1】:

为避免此问题,您可以检查您的活动是否正在完成:

@Override
public void onBackPressed() 
    if (!isFinishing()) 
        super.onBackPressed();
        if (screen_Name != 0 && screen_Name == Constants.TAG_WIDGET_SCREEN) 
            int tagID = getIntent().getIntExtra(Constants.TAG_ID, -1);
            int tagcount = getIntent().getIntExtra(Constants.TAG_COUNT, 0);
            if (tagcount > 0) 
                mDBAdapter.updateTagCountToZero(tagID);
            
            PreferenceUtils.getInstance(NewsActivity.this).remove(Constants.NEWS + type);
            PreferenceUtils.getInstance(NewsActivity.this).remove(Constants.CARD_PREF + cardPref);
        
    

【讨论】:

【参考方案2】:
Super.onBackPressed() 

将对您的活动调用完成。如果你想完成这个活动,首先执行你需要的,然后在最后调用它。

【讨论】:

您好,请查看日志,FragmentManagerImpl.checkStateLoss(MyApplication:1533) 发生异常。 我在 super.backPressed() 之后只做 SharedPreference 相关的任务。如果您在流程中看到 onOptionsItemSelected() -> onBackPressed -> ...checkStateLoss() 和异常。所以我认为异常发生在 Preference 任务之前。 你可以将 super.onBackpressed() 方法调用移动到 onBackPressed() 方法的末尾吗?正如我所提到的, super.onBackPressed() 将触发活动完成。 好的我会搬家的,但是这个问题不复现了。这是在现场 apk 中出现的。所以我不知道确切的原因。最后我会调用 super.onBackPressed() 。我希望它会奏效。我只想知道原因 此错误是直截了当的,与片段无关。这表示我们可以执行任何改变活动当前状态的操作,因为活动上的 onSavedInstance 已经被调用,这意味着这个活动已经失去了用户焦点。

以上是关于java.lang.IllegalStateException:onSaveInstanceState On Activity Backpress 后无法执行此操作(不使用任何片段)的主要内容,如果未能解决你的问题,请参考以下文章