YoKeyword / Fragmentation

[DEPRECATED] A powerful library that manage Fragment for Android
Apache License 2.0
9.72k stars 2.11k forks source link

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState #317

Closed KXwonderful closed 7 years ago

KXwonderful commented 7 years ago

支付界面选择微信支付,微信支付后通过EventBus 发送事件并关闭微信支付成功界面返回支付界面操作跳转到指定界面时报错

YoKeyword commented 7 years ago

在你离开当前Activity等情况下,系统会调用onSaveInstanceState()帮你保存当前Activity的状态、数据等,直到再回到该Activity之前(onResume()之前),你执行Fragment事务,就会抛出该异常!(一般是其他Activity的回调让当前页面执行事务的情况,会引发该问题)

解决方法:

KXwonderful commented 7 years ago

我是在fragment内的,尝试了下面的方法也可行,但不知道会不会出现其他问题: `

private boolean isOnSave = false; // 判断 onSaveInstanceState() 是否执行
Runnable mGotoDetailRunnable;     // runnable接口

@Subscribe()
public void weChatPaySucceed(WeChatPaySucceedEvent event){

    // 0    成功  展示成功页面
    // -1   错误  可能的原因:签名错误、未注册APPID...
    // -2   用户取消    
    if (event.errCode == 0){
        if (isOnSave){
            mGotoDetailRunnable = new Runnable() {
                @Override
                public void run() {
                    goToDetail();
                }
            };
        } else {
            goToDetail();
        }

    } else {
        ToastUtils.show("支付失败,请重试");
    }
}

/**
 * 去订单详情界面
 */
private void goToDetail(){
    ...
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    isOnSave = true;
}

@Override
public void onResume() {
    super.onResume();
    if (mGotoDetailRunnable != null) {
        // 执行去订单详情界面
        mGotoDetailRunnable.run();
    }
}

`

YoKeyword commented 7 years ago

@KXwonderful
可以的~

记得isOnSave需要在onResume()/onResumeFragments()里恢复成 false