我有一个注册活动,里面有多个片段(逐步注册流程)..
在活动中,我有这个处理片段转换的updateRegistrationStage()方法。这里是问题所在: 1)我点击继续按钮,向服务器提交一些数据并等待响应。 2)在我得到任何回复之前,我按下主页按钮,以便app进入后台.. 3)然后,我得到了响应并且应该跳到下一个片段......此时,我打电话给:
transaction = fm.beginTransaction();
transaction.add(R.id.registration_container, newFragment, newFragment.toString());
transaction.commit();
应用程序崩溃..投掷
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
如果我将最后一行更改为
transaction.commitAllowingStateLoss();
会说
java.lang.IllegalStateException: Activity has been destroyed
我认为可以设置一个标志,例如isActivityAlive在活动仍然活着时确保事务提交......但是......这非常难看。当活动不再有效时,是否有更好的方法来取消片段交易
答案 0 :(得分:1)
您必须从UI单独存储注册状态,并使用侦听器进行更新UI。使用活动回调onStart
来更新状态并初始化所有侦听器,使用onStop
来处理侦听器
更新:我为这个解决方案写了一个简单的存根,但我没有尝试编译。仅举例来说
//UI
public class RCMActivity extends Activity {
RegistrationManager registrationManager = RegistrationManager.getInstance();
OnRegistrationListener listener = new OnRegistrationListener() {
public void onComplete(State state) {
//change UI here
}
public void onFailed() {}
}
@Override
protected void onStart() {
super.onStart();
registrationManager.setListener(listener);
}
@Override
protected void onStop() {
super.onStart();
registrationManager.setListener(null);
}
}
//state in separate file
public class RegistrationManager {
enum State {IDLE, FIRST_STEP, SECOND_STEP, THIRD_STEP};
public interface OnRegistrationListener {
void onComplete(State state);
void onFailded();
}
private OnRegistrationListener listener;
private State state = IDLE;
public void setOnRegistrationListener(OnRegistrationListener l)
{
listener = l;
}
public static RegistrationManager getInstance() {//for example it's singleton}
}