2014-10-29 32 views
0

我有一個註冊活動,在其內部我有多個片段(步驟一步登記流量)..的Android片段轉變發生的應用程序進入後背景

在活動,我這個updateRegistrationStage()方法,該方法處理片段轉換..這裏是問題: 1)我點擊繼續按鈕,提交一些數據到服務器,並等待迴應.. 2)在我得到任何迴應之前,我按Home按鈕,所以應用程序進入背景.. 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

您必須從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} 
} 
+0

你能給我更多的細節嗎?什麼應該是正確的流程/結構..例子? – xialin 2014-10-30 01:20:04

+0

請看我上面的更新 – Tpec1k 2014-10-30 07:58:21