Closed KXwonderful closed 7 years ago
在你离开当前Activity等情况下,系统会调用onSaveInstanceState()帮你保存当前Activity的状态、数据等,直到再回到该Activity之前(onResume()之前),你执行Fragment事务,就会抛出该异常!(一般是其他Activity的回调让当前页面执行事务的情况,会引发该问题)
解决方法:
见代码:
@Override
// 如果是在Fragment内, 则复写onResumeFragments()改为onResume()即可
protected void onResumeFragments() {
super.onResumeFragments();
mIsSaved = true;
if (mTransactionEvent != null) {
// 这里执行事务
mTransactionEvent = null;
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mIsSaved = false;
}
@Subscribe(sticky = true) // 加入sticky=true, 可以保证被强杀也可以正常执行 事务
public void onEvent(TransactionEvent event) {
if (mIsSaved) {
// 这里执行事务
} else {
mTransactionEvent = event;
}
}
我是在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();
}
}
`
@KXwonderful
可以的~
记得isOnSave
需要在onResume()
/onResumeFragments()
里恢复成 false
支付界面选择微信支付,微信支付后通过EventBus 发送事件并关闭微信支付成功界面返回支付界面操作跳转到指定界面时报错