应用程序进入后台后会发生Android片段转换

时间:2014-10-29 15:33:31

标签: android android-fragments fragmentmanager

我有一个注册活动,里面有多个片段(逐步注册流程)..

在活动中,我有这个处理片段转换的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在活动仍然活着时确保事务提交......但是......这非常难看。当活动不再有效时,是否有更好的方法来取消片段交易

1 个答案:

答案 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}
}