java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
You should do the transaction in a Handler
as follows:
@Override
protected void onPostExecute(String result) {
Log.v("MyFragmentActivity", "onFriendAddedAsyncTask/onPostExecute");
new Handler().post(new Runnable() {
public void run() {
fm = getSupportFragmentManager();
ft = fm.beginTransaction();
ft.remove(dummyFragment);
ft.commit();
}
});
}
Thanks Oleg Vaskevich. Using a WeakReference
of the FragmentActivity
solved the problem. My code looks as follows now:
public class MyFragmentActivity extends FragmentActivity implements OnFriendAddedListener {
private static WeakReference<MyFragmentActivity> wrActivity = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
wrActivity = new WeakReference<MyFragmentActivity>(this);
...
private class onFriendAddedAsyncTask extends AsyncTask<String, Void, String> {
@Override
protected void onPreExecute() {
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
DummyFragment dummyFragment = DummyFragment.newInstance();
ft.add(R.id.dummy_fragment_layout, dummyFragment);
ft.commit();
}
@Override
protected void onPostExecute(String result) {
final Activity activity = wrActivity.get();
if (activity != null && !activity.isFinishing()) {
FragmentManager fm = activity.getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
DummyFragment dummyFragment = (DummyFragment) fm.findFragmentById(R.id.dummy_fragment_layout);
ft.remove(dummyFragment);
ft.commitAllowingStateLoss();
}
}
I believe the correct answer to this question is the following method.
public abstract int commitAllowingStateLoss ()
Like commit() but allows the commit to be executed after an activity's state is saved. This is dangerous because the commit can be lost if the activity needs to later be restored from its state, so this should only be used for cases where it is okay for the UI state to change unexpectedly on the user.
The above description relates to this method.
protected void onSaveInstanceState(android.os.Bundle outState)
This problem occurs precisely when the device goes to sleep.
http://developer.android.com/reference/android/app/FragmentTransaction.html