Note that there are some explanatory texts on larger screens.

plurals
  1. POCreating fragment by external event == possible IllegalStateException?
    primarykey
    data
    text
    <p>Let's imagine I have an activity that registers BroadcastReceiver to listen for some event that independent to activity's lifecycle. Receiver can be registered on the activity's onStart/onStop or onResume/onPause. When event received, I want to create and show a fragment, for example to show event details. This works, but sometimes app crashes with "IllegalStateException: Can not perform this action after onSaveInstanceState".</p> <p>I think, this may comes when activity going to pause and stop state, already saved its internal state, but BroadcastReceiver is not already unregistered, and at this moment comes new external event.</p> <p>Fragment manager saves it's state on onSaveInstanceState(). According to official documentation, "If called, onSaveInstanceState() will occur before onStop(). There are no guarantees about whether it will occur before or after onPause()". So, even I will registered receiver on the onResume() and unregistering on the onPause(), there is no guarantees to avoid IllegalStateException because activity can save it's internal state before onPause().</p> <p>Maybe, the possible solution is override onSaveInstanceState() and set here the own boolean flag like mStateSaved. And, when new event received, analyze this flag: if it was set, assume that activity going to pause-stop state, and do not start fragment transaction. </p> <p>I'm interesting, maybe there is the better solution.</p> <p>Thank you for your attention!</p> <p><strong>Updated</strong> (code example, Fragment):</p> <pre><code>@Override protected void onStart() { super.onStart(); mActionInformer.addObserver( onActionInformerUpdated ); } @Override protected void onStop() { super.onStop(); mActionInformer.deleteObserver( onActionInformerUpdated ); } Observer onActionInformerUpdated = new Observer() { @Override public void update( Observable observable, Object data ) { TaskEvent event = (TaskEvent) data; if( event == TaskEvent.START ) { setSupportProgressBarIndeterminateVisibility( true ); } else { setSupportProgressBarIndeterminateVisibility( false ); // update ActionBar invalidateOptionsMenu(); // handle authorisation event if( event == TaskEvent.AUTH ) { String msg = mActionInformer.getExtraMessage(); DialogFragment dlg = AuthorisationDialog.newInstance( msg ); dlg.show( getFragmentManager(), "Authorisation" ); } } } }; </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload