2017-05-04 94 views
-1

当试图在接收到来自的AsyncTask的响应,以取代片段我收到一个下面的错误。在一个简化版本,我的活动包含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


这个问题有一个备用解决方案。使用标志,你可以处理它,就像下面

/** 
* 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(); 
    } 
} 
相关问题