2017-05-04 2 views
-1

に私は次のエラーを取得しています。私の活動は4主要なメソッド(のonCreate、taskCompleted、parseJSONとfragmentReplace)が含まれている単純化されたバージョンでは、それはユーザーが起動時にどのフラグメントが表示されるはず決定しますIllegalStateExceptionがAsyncTask

private AsyncTask mMyTask; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mMyTask = new AsyncTask(this, this); 
    mMyTask.executeTaskCall("check_user"); 
} 


@Override 
public void taskCompleted(String results) { 
    try { 
     JSONObject jsonBody = new JSONObject(results); 
     parseJSON(jsonBody); 
    } 
    catch (JSONException je){ 
    } 
} 

private void parseJSON(JSONObject jsonBody) throws JSONException { 
    boolean userActive = jsonBody.getBoolean("result"); 

    if (userActive){ 
     fragmentReplace(new FirstFragment(), "FirstFragment"); 
    } 
    else { 
     fragmentReplace(new SecondFragment(), "SecondFragment"); 
    } 
} 

public void fragmentReplace(Fragment fragment, String fragmentTag){ 
    getSupportFragmentManager() 
      .beginTransaction() 
      .replace(R.id.layout_container, fragment, fragmentTag) 
      .commit(); 
} 

この例外の理由はとてもランダム何が起こっていますか?

答えて

1

WeakReferenceソリューション(またはその他の場合もあります)をjava.lang.IllegalStateException: Can not perform this action after onSaveInstanceStateにお読みください。


この問題の代替方法が1つあります。フラグを使用すると、次のような

/** 
* Flag to avoid "java.lang.IllegalStateException: Can not perform this action after 
* onSaveInstanceState". Avoid Fragment transaction until onRestoreInstanceState or onResume 
* gets called. 
*/ 
private boolean isOnSaveInstanceStateCalled = false; 


@Override 
public void onRestoreInstanceState(final Bundle bundle) { 
    ..... 
    isOnSaveInstanceStateCalled = false; 
    ..... 
} 

@Override 
public void onSaveInstanceState(final Bundle outState) { 
    ..... 
    isOnSaveInstanceStateCalled = true; 
    ..... 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    isOnSaveInstanceStateCalled = false; 
    ..... 
} 

の下に、それを扱うことができ、フラグメント取引をしながら、あなたはこのboolean値を確認することができます。

private void fragmentReplace(Fragment fragment, String fragmentTag){ 
    if (!isOnSaveInstanceStateCalled) { 
     getSupportFragmentManager() 
       .beginTransaction() 
       .replace(R.id.layout_container, fragment, fragmentTag) 
       .commit(); 
    } 
} 
関連する問題