我有一个注册活动,其中有多个片段(分步注册流程)。。
在活动中,我有一个updateRegistrationStage()方法,用于处理片段转换。。问题是:1) 我点击继续按钮,向服务器提交一些数据,等待响应。。2) 在我得到任何回应之前,我按下主页按钮,应用程序进入后台。。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,以确保在活动仍然存在时提交事务。。。但是真难看。当活动不再活动时,有没有更好的方法来取消碎片事务?
您必须将注册状态与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}
}