murraycu / android-galaxyzoo

This Android app lets you classify Galaxy Zoo subjects. It is available in the Google Play Store: https://play.google.com/store/apps/details?id=com.murrayc.galaxyzoo.app . Try beta versions early here: https://play.google.com/apps/testing/com.murrayc.galaxyzoo.app . See also the iPhone app for Galaxy Zoo: https://github.com/murraycu/ios-galaxyzoo/
GNU General Public License v3.0
11 stars 13 forks source link

Crash: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState #10

Closed murraycu closed 9 years ago

murraycu commented 9 years ago

I, and at least one other user, have seen this crash. It might be happening when ClassifyFragment is trying to show the AlertDialog about generic network problems, via its warnAboutNetworkProblemWithRetry() method.

This is part of the stacktrace seems to be relevant:

at com.murrayc.galaxyzoo.app.ClassifyFragment.void showChildFragments(boolean)(Unknown Source)
at com.murrayc.galaxyzoo.app.ClassifyFragment.void showLoadingInProgress(boolean)(Unknown Source)
at com.murrayc.galaxyzoo.app.ClassifyFragment.void warnAboutNetworkProblemWithRetry(android.app.Activity,java.lang.String)(Unknown Source)

The complete deobfuscated/retraced stacktrace looks like this:

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.void checkStateLoss()(Unknown Source)
at android.support.v4.app.FragmentManagerImpl.void throwException(java.lang.RuntimeException)(Unknown Source)
                                              android.support.v4.app.FragmentTransaction beginTransaction()
                                              void putFragment(android.os.Bundle,java.lang.String,android.support.v4.app.Fragment)
                                              android.support.v4.app.Fragment getFragment(android.os.Bundle,java.lang.String)
                                              void dump(java.lang.String,java.io.FileDescriptor,java.io.PrintWriter,java.lang.String[])
                                              android.view.animation.Animation makeOpenCloseAnimation(android.content.Context,float,float,float,float)
                                              android.view.animation.Animation makeFadeAnimation(android.content.Context,float,float)
                                              android.view.animation.Animation loadAnimation(android.support.v4.app.Fragment,int,boolean,int)
                                              void performPendingDeferredStart(android.support.v4.app.Fragment)
                                              void moveToState(android.support.v4.app.Fragment,int,int,int,boolean)
                                              void moveToState(int,boolean)
                                              void moveToState(int,int,int,boolean)
                                              void addFragment(android.support.v4.app.Fragment,boolean)
                                              void removeFragment(android.support.v4.app.Fragment,int,int)
                                              android.support.v4.app.Fragment findFragmentById(int)
                                              android.support.v4.app.Fragment findFragmentByTag(java.lang.String)
                                              void enqueueAction(java.lang.Runnable,boolean)
                                              int allocBackStackIndex(android.support.v4.app.BackStackRecord)
                                              void setBackStackIndex(int,android.support.v4.app.BackStackRecord)
                                              boolean popBackStackState(android.os.Handler,java.lang.String,int,int)
                                              void restoreAllState(android.os.Parcelable,java.util.ArrayList)
                                              void attachActivity(android.support.v4.app.FragmentActivity,android.support.v4.app.FragmentContainer,android.support.v4.app.Fragment)
                                              void dispatchConfigurationChanged(android.content.res.Configuration)
                                              boolean dispatchCreateOptionsMenu(android.view.Menu,android.view.MenuInflater)
                                              boolean dispatchPrepareOptionsMenu(android.view.Menu)
                                              boolean dispatchOptionsItemSelected(android.view.MenuItem)
at android.support.v4.app.BackStackRecord.void dump(java.lang.String,java.io.FileDescriptor,java.io.PrintWriter,java.lang.String[])(Unknown Source)
                                          void dump(java.lang.String,java.io.PrintWriter,boolean)
                                          void addOp(android.support.v4.app.BackStackRecord$Op)
                                          android.support.v4.app.FragmentTransaction add(int,android.support.v4.app.Fragment,java.lang.String)
                                          void doAddOp(int,android.support.v4.app.Fragment,java.lang.String,int)
                                          android.support.v4.app.FragmentTransaction replace(int,android.support.v4.app.Fragment)
                                          android.support.v4.app.FragmentTransaction hide(android.support.v4.app.Fragment)
                                          void bumpBackStackNesting(int)
                                          int commit()
                                          int commitInternal(boolean)
                                          void setFirstOut(android.util.SparseArray,android.support.v4.app.Fragment)
                                          void calculateBackFragments(android.util.SparseArray,android.util.SparseArray)
                                          android.support.v4.app.BackStackRecord$TransitionState popFromBackStack(boolean,android.support.v4.app.BackStackRecord$TransitionState,android.util.SparseArray,android.util.SparseArray)
                                          android.support.v4.app.BackStackRecord$TransitionState beginTransition(android.util.SparseArray,android.util.SparseArray,boolean)
                                          java.lang.Object getEnterTransition(android.support.v4.app.Fragment,boolean)
                                          java.lang.Object getSharedElementTransition(android.support.v4.app.Fragment,android.support.v4.app.Fragment,boolean)
                                          java.lang.Object captureExitingViews(java.lang.Object,android.support.v4.app.Fragment,java.util.ArrayList,android.support.v4.util.ArrayMap)
                                          android.support.v4.util.ArrayMap remapSharedElements(android.support.v4.app.BackStackRecord$TransitionState,android.support.v4.app.Fragment,boolean)
                                          boolean configureTransitions(int,android.support.v4.app.BackStackRecord$TransitionState,boolean,android.util.SparseArray,android.util.SparseArray)
                                          void prepareSharedElementTransition(android.support.v4.app.BackStackRecord$TransitionState,android.view.View,java.lang.Object,android.support.v4.app.Fragment,android.support.v4.app.Fragment,boolean,java.util.ArrayList)
                                          void callSharedElementEnd(android.support.v4.app.BackStackRecord$TransitionState,android.support.v4.app.Fragment,android.support.v4.app.Fragment,boolean,android.support.v4.util.ArrayMap)
                                          void setEpicenterIn(android.support.v4.util.ArrayMap,android.support.v4.app.BackStackRecord$TransitionState)
                                          android.support.v4.util.ArrayMap mapSharedElementsIn(android.support.v4.app.BackStackRecord$TransitionState,boolean,android.support.v4.app.Fragment)
                                          android.support.v4.util.ArrayMap remapNames(java.util.ArrayList,java.util.ArrayList,android.support.v4.util.ArrayMap)
                                          void excludeHiddenFragmentsAfterEnter(android.view.View,android.support.v4.app.BackStackRecord$TransitionState,int,java.lang.Object)
                                          void excludeHiddenFragments(android.support.v4.app.BackStackRecord$TransitionState,int,java.lang.Object)
                                          void setNameOverride(android.support.v4.util.ArrayMap,java.lang.String,java.lang.String)
                                          void setNameOverrides(android.support.v4.app.BackStackRecord$TransitionState,java.util.ArrayList,java.util.ArrayList)
                                          void setBackNameOverrides(android.support.v4.app.BackStackRecord$TransitionState,android.support.v4.util.ArrayMap,boolean)
                                          android.support.v4.util.ArrayMap access$000(android.support.v4.app.BackStackRecord,android.support.v4.app.BackStackRecord$TransitionState,boolean,android.support.v4.app.Fragment)
                                          void access$100(android.support.v4.app.BackStackRecord,android.support.v4.util.ArrayMap,android.support.v4.app.BackStackRecord$TransitionState)
                                          void access$200(android.support.v4.app.BackStackRecord,android.support.v4.app.BackStackRecord$TransitionState,android.support.v4.app.Fragment,android.support.v4.app.Fragment,boolean,android.support.v4.util.ArrayMap)
                                          void access$300(android.support.v4.app.BackStackRecord,android.support.v4.app.BackStackRecord$TransitionState,int,java.lang.Object)
at android.support.v4.app.BackStackRecord.void dump(java.lang.String,java.io.FileDescriptor,java.io.PrintWriter,java.lang.String[])(Unknown Source)
                                          void dump(java.lang.String,java.io.PrintWriter,boolean)
                                          void addOp(android.support.v4.app.BackStackRecord$Op)
                                          android.support.v4.app.FragmentTransaction add(int,android.support.v4.app.Fragment,java.lang.String)
                                          void doAddOp(int,android.support.v4.app.Fragment,java.lang.String,int)
                                          android.support.v4.app.FragmentTransaction replace(int,android.support.v4.app.Fragment)
                                          android.support.v4.app.FragmentTransaction hide(android.support.v4.app.Fragment)
                                          void bumpBackStackNesting(int)
                                          int commit()
                                          int commitInternal(boolean)
                                          void setFirstOut(android.util.SparseArray,android.support.v4.app.Fragment)
                                          void calculateBackFragments(android.util.SparseArray,android.util.SparseArray)
                                          android.support.v4.app.BackStackRecord$TransitionState popFromBackStack(boolean,android.support.v4.app.BackStackRecord$TransitionState,android.util.SparseArray,android.util.SparseArray)
                                          android.support.v4.app.BackStackRecord$TransitionState beginTransition(android.util.SparseArray,android.util.SparseArray,boolean)
                                          java.lang.Object getEnterTransition(android.support.v4.app.Fragment,boolean)
                                          java.lang.Object getSharedElementTransition(android.support.v4.app.Fragment,android.support.v4.app.Fragment,boolean)
                                          java.lang.Object captureExitingViews(java.lang.Object,android.support.v4.app.Fragment,java.util.ArrayList,android.support.v4.util.ArrayMap)
                                          android.support.v4.util.ArrayMap remapSharedElements(android.support.v4.app.BackStackRecord$TransitionState,android.support.v4.app.Fragment,boolean)
                                          boolean configureTransitions(int,android.support.v4.app.BackStackRecord$TransitionState,boolean,android.util.SparseArray,android.util.SparseArray)
                                          void prepareSharedElementTransition(android.support.v4.app.BackStackRecord$TransitionState,android.view.View,java.lang.Object,android.support.v4.app.Fragment,android.support.v4.app.Fragment,boolean,java.util.ArrayList)
                                          void callSharedElementEnd(android.support.v4.app.BackStackRecord$TransitionState,android.support.v4.app.Fragment,android.support.v4.app.Fragment,boolean,android.support.v4.util.ArrayMap)
                                          void setEpicenterIn(android.support.v4.util.ArrayMap,android.support.v4.app.BackStackRecord$TransitionState)
                                          android.support.v4.util.ArrayMap mapSharedElementsIn(android.support.v4.app.BackStackRecord$TransitionState,boolean,android.support.v4.app.Fragment)
                                          android.support.v4.util.ArrayMap remapNames(java.util.ArrayList,java.util.ArrayList,android.support.v4.util.ArrayMap)
                                          void excludeHiddenFragmentsAfterEnter(android.view.View,android.support.v4.app.BackStackRecord$TransitionState,int,java.lang.Object)
                                          void excludeHiddenFragments(android.support.v4.app.BackStackRecord$TransitionState,int,java.lang.Object)
                                          void setNameOverride(android.support.v4.util.ArrayMap,java.lang.String,java.lang.String)
                                          void setNameOverrides(android.support.v4.app.BackStackRecord$TransitionState,java.util.ArrayList,java.util.ArrayList)
                                          void setBackNameOverrides(android.support.v4.app.BackStackRecord$TransitionState,android.support.v4.util.ArrayMap,boolean)
                                          android.support.v4.util.ArrayMap access$000(android.support.v4.app.BackStackRecord,android.support.v4.app.BackStackRecord$TransitionState,boolean,android.support.v4.app.Fragment)
                                          void access$100(android.support.v4.app.BackStackRecord,android.support.v4.util.ArrayMap,android.support.v4.app.BackStackRecord$TransitionState)
                                          void access$200(android.support.v4.app.BackStackRecord,android.support.v4.app.BackStackRecord$TransitionState,android.support.v4.app.Fragment,android.support.v4.app.Fragment,boolean,android.support.v4.util.ArrayMap)
                                          void access$300(android.support.v4.app.BackStackRecord,android.support.v4.app.BackStackRecord$TransitionState,int,java.lang.Object)
at com.murrayc.galaxyzoo.app.ClassifyFragment.void showChildFragments(boolean)(Unknown Source)
at com.murrayc.galaxyzoo.app.ClassifyFragment.void showLoadingInProgress(boolean)(Unknown Source)
at com.murrayc.galaxyzoo.app.ClassifyFragment.void warnAboutNetworkProblemWithRetry(android.app.Activity,java.lang.String)(Unknown Source)
                                              android.view.View onCreateView(android.view.LayoutInflater,android.view.ViewGroup,android.os.Bundle)
                                              void onCreateOptionsMenu(android.view.Menu,android.view.MenuInflater)
                                              android.support.v4.content.Loader onCreateLoader(int,android.os.Bundle)
                                              void onLoadFinished(android.support.v4.content.Loader,android.database.Cursor)
                                              void onLoaderReset(android.support.v4.content.Loader)
                                              void onLoadFinished(android.support.v4.content.Loader,java.lang.Object)
                                              void access$000(com.murrayc.galaxyzoo.app.ClassifyFragment)
                                              android.app.AlertDialog access$102(com.murrayc.galaxyzoo.app.ClassifyFragment,android.app.AlertDialog)
at android.support.v4.app.LoaderManagerImpl.android.support.v4.app.LoaderManagerImpl$LoaderInfo createLoader(int,android.os.Bundle,android.support.v4.app.LoaderManager$LoaderCallbacks)(Unknown Source)
                                            void doStop()
at android.support.v4.app.LoaderManagerImpl.android.support.v4.app.LoaderManagerImpl$LoaderInfo createAndInstallLoader(int,android.os.Bundle,android.support.v4.app.LoaderManager$LoaderCallbacks)(Unknown Source)
                                            void doRetain()
at android.support.v4.app.LoaderManagerImpl.android.support.v4.content.Loader restartLoader(int,android.os.Bundle,android.support.v4.app.LoaderManager$LoaderCallbacks)(Unknown Source)
                                            void doStart()
at com.murrayc.galaxyzoo.app.ClassifyFragment.void update()(Unknown Source)
at com.murrayc.galaxyzoo.app.ClassifyActivity.void startNextClassification()(Unknown Source)
at com.murrayc.galaxyzoo.app.ClassifyActivity.void onClassificationFinished()(Unknown Source)
at com.murrayc.galaxyzoo.app.QuestionFragment$SaveClassificationTask.java.lang.Void doInBackground(java.lang.Void[])(Unknown Source)
                                                                     void onPostExecute(java.lang.Void)
at com.murrayc.galaxyzoo.app.QuestionFragment$SaveClassificationTask.void onPostExecute(java.lang.Object)(Unknown Source)
at android.os.AsyncTask.finish(AsyncTask.java:602)
at android.os.AsyncTask.access$600(AsyncTask.java:156)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4507)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:978)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:745)
at dalvik.system.NativeStart.main(Native Method)
murraycu commented 9 years ago

Maybe this nasty workaround code will avoid this crash: https://github.com/murraycu/android-galaxyzoo/commit/9c491b3a249b7af2e4bad5ca397ff5f89e5d37db

murraycu commented 9 years ago

This seems to be fixed. At least I haven't seen the crash for a while either on my own devices or via Play store crash reports.

murraycu commented 9 years ago

This is apparently not fixed. Here is much the same stacktrace from a recent crash report on Android 4.4 on an Xperia M2 Aqua, with version 1.35

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.void checkStateLoss()(Unknown Source)
at android.support.v4.app.FragmentManagerImpl.void throwException(java.lang.RuntimeException)(Unknown Source)
                                              android.support.v4.app.FragmentTransaction beginTransaction()
                                              void putFragment(android.os.Bundle,java.lang.String,android.support.v4.app.Fragment)
                                              android.support.v4.app.Fragment getFragment(android.os.Bundle,java.lang.String)
                                              void dump(java.lang.String,java.io.FileDescriptor,java.io.PrintWriter,java.lang.String[])
                                              android.view.animation.Animation makeOpenCloseAnimation(android.content.Context,float,float,float,float)
                                              android.view.animation.Animation makeFadeAnimation(android.content.Context,float,float)
                                              android.view.animation.Animation loadAnimation(android.support.v4.app.Fragment,int,boolean,int)
                                              void performPendingDeferredStart(android.support.v4.app.Fragment)
                                              void moveToState(android.support.v4.app.Fragment,int,int,int,boolean)
                                              void moveToState(int,boolean)
                                              void moveToState(int,int,int,boolean)
                                              void addFragment(android.support.v4.app.Fragment,boolean)
                                              void removeFragment(android.support.v4.app.Fragment,int,int)
                                              android.support.v4.app.Fragment findFragmentById(int)
                                              android.support.v4.app.Fragment findFragmentByTag(java.lang.String)
                                              void enqueueAction(java.lang.Runnable,boolean)
                                              int allocBackStackIndex(android.support.v4.app.BackStackRecord)
                                              void setBackStackIndex(int,android.support.v4.app.BackStackRecord)
                                              boolean popBackStackState(android.os.Handler,java.lang.String,int,int)
                                              void restoreAllState(android.os.Parcelable,java.util.ArrayList)
                                              void attachActivity(android.support.v4.app.FragmentActivity,android.support.v4.app.FragmentContainer,android.support.v4.app.Fragment)
                                              void dispatchConfigurationChanged(android.content.res.Configuration)
                                              boolean dispatchCreateOptionsMenu(android.view.Menu,android.view.MenuInflater)
                                              boolean dispatchPrepareOptionsMenu(android.view.Menu)
                                              boolean dispatchOptionsItemSelected(android.view.MenuItem)
at android.support.v4.app.BackStackRecord.void dump(java.lang.String,java.io.FileDescriptor,java.io.PrintWriter,java.lang.String[])(Unknown Source)
                                          void dump(java.lang.String,java.io.PrintWriter,boolean)
                                          void addOp(android.support.v4.app.BackStackRecord$Op)
                                          android.support.v4.app.FragmentTransaction add(int,android.support.v4.app.Fragment,java.lang.String)
                                          void doAddOp(int,android.support.v4.app.Fragment,java.lang.String,int)
                                          android.support.v4.app.FragmentTransaction replace(int,android.support.v4.app.Fragment)
                                          android.support.v4.app.FragmentTransaction hide(android.support.v4.app.Fragment)
                                          void bumpBackStackNesting(int)
                                          int commit()
                                          int commitInternal(boolean)
                                          void setFirstOut(android.util.SparseArray,android.support.v4.app.Fragment)
                                          void calculateBackFragments(android.util.SparseArray,android.util.SparseArray)
                                          android.support.v4.app.BackStackRecord$TransitionState popFromBackStack(boolean,android.support.v4.app.BackStackRecord$TransitionState,android.util.SparseArray,android.util.SparseArray)
                                          android.support.v4.app.BackStackRecord$TransitionState beginTransition(android.util.SparseArray,android.util.SparseArray,boolean)
                                          java.lang.Object getEnterTransition(android.support.v4.app.Fragment,boolean)
                                          java.lang.Object getSharedElementTransition(android.support.v4.app.Fragment,android.support.v4.app.Fragment,boolean)
                                          java.lang.Object captureExitingViews(java.lang.Object,android.support.v4.app.Fragment,java.util.ArrayList,android.support.v4.util.ArrayMap)
                                          android.support.v4.util.ArrayMap remapSharedElements(android.support.v4.app.BackStackRecord$TransitionState,android.support.v4.app.Fragment,boolean)
                                          boolean configureTransitions(int,android.support.v4.app.BackStackRecord$TransitionState,boolean,android.util.SparseArray,android.util.SparseArray)
                                          void prepareSharedElementTransition(android.support.v4.app.BackStackRecord$TransitionState,android.view.View,java.lang.Object,android.support.v4.app.Fragment,android.support.v4.app.Fragment,boolean,java.util.ArrayList)
                                          void callSharedElementEnd(android.support.v4.app.BackStackRecord$TransitionState,android.support.v4.app.Fragment,android.support.v4.app.Fragment,boolean,android.support.v4.util.ArrayMap)
                                          void setEpicenterIn(android.support.v4.util.ArrayMap,android.support.v4.app.BackStackRecord$TransitionState)
                                          android.support.v4.util.ArrayMap mapSharedElementsIn(android.support.v4.app.BackStackRecord$TransitionState,boolean,android.support.v4.app.Fragment)
                                          android.support.v4.util.ArrayMap remapNames(java.util.ArrayList,java.util.ArrayList,android.support.v4.util.ArrayMap)
                                          void excludeHiddenFragmentsAfterEnter(android.view.View,android.support.v4.app.BackStackRecord$TransitionState,int,java.lang.Object)
                                          void excludeHiddenFragments(android.support.v4.app.BackStackRecord$TransitionState,int,java.lang.Object)
                                          void setNameOverride(android.support.v4.util.ArrayMap,java.lang.String,java.lang.String)
                                          void setNameOverrides(android.support.v4.app.BackStackRecord$TransitionState,java.util.ArrayList,java.util.ArrayList)
                                          void setBackNameOverrides(android.support.v4.app.BackStackRecord$TransitionState,android.support.v4.util.ArrayMap,boolean)
                                          android.support.v4.util.ArrayMap access$000(android.support.v4.app.BackStackRecord,android.support.v4.app.BackStackRecord$TransitionState,boolean,android.support.v4.app.Fragment)
                                          void access$100(android.support.v4.app.BackStackRecord,android.support.v4.util.ArrayMap,android.support.v4.app.BackStackRecord$TransitionState)
                                          void access$200(android.support.v4.app.BackStackRecord,android.support.v4.app.BackStackRecord$TransitionState,android.support.v4.app.Fragment,android.support.v4.app.Fragment,boolean,android.support.v4.util.ArrayMap)
                                          void access$300(android.support.v4.app.BackStackRecord,android.support.v4.app.BackStackRecord$TransitionState,int,java.lang.Object)
at android.support.v4.app.BackStackRecord.void dump(java.lang.String,java.io.FileDescriptor,java.io.PrintWriter,java.lang.String[])(Unknown Source)
                                          void dump(java.lang.String,java.io.PrintWriter,boolean)
                                          void addOp(android.support.v4.app.BackStackRecord$Op)
                                          android.support.v4.app.FragmentTransaction add(int,android.support.v4.app.Fragment,java.lang.String)
                                          void doAddOp(int,android.support.v4.app.Fragment,java.lang.String,int)
                                          android.support.v4.app.FragmentTransaction replace(int,android.support.v4.app.Fragment)
                                          android.support.v4.app.FragmentTransaction hide(android.support.v4.app.Fragment)
                                          void bumpBackStackNesting(int)
                                          int commit()
                                          int commitInternal(boolean)
                                          void setFirstOut(android.util.SparseArray,android.support.v4.app.Fragment)
                                          void calculateBackFragments(android.util.SparseArray,android.util.SparseArray)
                                          android.support.v4.app.BackStackRecord$TransitionState popFromBackStack(boolean,android.support.v4.app.BackStackRecord$TransitionState,android.util.SparseArray,android.util.SparseArray)
                                          android.support.v4.app.BackStackRecord$TransitionState beginTransition(android.util.SparseArray,android.util.SparseArray,boolean)
                                          java.lang.Object getEnterTransition(android.support.v4.app.Fragment,boolean)
                                          java.lang.Object getSharedElementTransition(android.support.v4.app.Fragment,android.support.v4.app.Fragment,boolean)
                                          java.lang.Object captureExitingViews(java.lang.Object,android.support.v4.app.Fragment,java.util.ArrayList,android.support.v4.util.ArrayMap)
                                          android.support.v4.util.ArrayMap remapSharedElements(android.support.v4.app.BackStackRecord$TransitionState,android.support.v4.app.Fragment,boolean)
                                          boolean configureTransitions(int,android.support.v4.app.BackStackRecord$TransitionState,boolean,android.util.SparseArray,android.util.SparseArray)
                                          void prepareSharedElementTransition(android.support.v4.app.BackStackRecord$TransitionState,android.view.View,java.lang.Object,android.support.v4.app.Fragment,android.support.v4.app.Fragment,boolean,java.util.ArrayList)
                                          void callSharedElementEnd(android.support.v4.app.BackStackRecord$TransitionState,android.support.v4.app.Fragment,android.support.v4.app.Fragment,boolean,android.support.v4.util.ArrayMap)
                                          void setEpicenterIn(android.support.v4.util.ArrayMap,android.support.v4.app.BackStackRecord$TransitionState)
                                          android.support.v4.util.ArrayMap mapSharedElementsIn(android.support.v4.app.BackStackRecord$TransitionState,boolean,android.support.v4.app.Fragment)
                                          android.support.v4.util.ArrayMap remapNames(java.util.ArrayList,java.util.ArrayList,android.support.v4.util.ArrayMap)
                                          void excludeHiddenFragmentsAfterEnter(android.view.View,android.support.v4.app.BackStackRecord$TransitionState,int,java.lang.Object)
                                          void excludeHiddenFragments(android.support.v4.app.BackStackRecord$TransitionState,int,java.lang.Object)
                                          void setNameOverride(android.support.v4.util.ArrayMap,java.lang.String,java.lang.String)
                                          void setNameOverrides(android.support.v4.app.BackStackRecord$TransitionState,java.util.ArrayList,java.util.ArrayList)
                                          void setBackNameOverrides(android.support.v4.app.BackStackRecord$TransitionState,android.support.v4.util.ArrayMap,boolean)
                                          android.support.v4.util.ArrayMap access$000(android.support.v4.app.BackStackRecord,android.support.v4.app.BackStackRecord$TransitionState,boolean,android.support.v4.app.Fragment)
                                          void access$100(android.support.v4.app.BackStackRecord,android.support.v4.util.ArrayMap,android.support.v4.app.BackStackRecord$TransitionState)
                                          void access$200(android.support.v4.app.BackStackRecord,android.support.v4.app.BackStackRecord$TransitionState,android.support.v4.app.Fragment,android.support.v4.app.Fragment,boolean,android.support.v4.util.ArrayMap)
                                          void access$300(android.support.v4.app.BackStackRecord,android.support.v4.app.BackStackRecord$TransitionState,int,java.lang.Object)
at com.murrayc.galaxyzoo.app.ClassifyFragment.void showChildFragments(boolean)(Unknown Source)
at com.murrayc.galaxyzoo.app.ClassifyFragment.void showLoadingInProgress(boolean)(Unknown Source)
at com.murrayc.galaxyzoo.app.ClassifyFragment.void onAttach(android.app.Activity)(Unknown Source)
                                              android.view.View onCreateView(android.view.LayoutInflater,android.view.ViewGroup,android.os.Bundle)
                                              void onCreateOptionsMenu(android.view.Menu,android.view.MenuInflater)
                                              android.support.v4.content.Loader onCreateLoader(int,android.os.Bundle)
                                              void onLoadFinished(android.support.v4.content.Loader,android.database.Cursor)
                                              void onLoaderReset(android.support.v4.content.Loader)
                                              void onLoadFinished(android.support.v4.content.Loader,java.lang.Object)
at android.support.v4.app.LoaderManagerImpl.android.support.v4.app.LoaderManagerImpl$LoaderInfo createLoader(int,android.os.Bundle,android.support.v4.app.LoaderManager$LoaderCallbacks)(Unknown Source)
                                            void doStop()
at android.support.v4.app.LoaderManagerImpl.android.support.v4.app.LoaderManagerImpl$LoaderInfo createAndInstallLoader(int,android.os.Bundle,android.support.v4.app.LoaderManager$LoaderCallbacks)(Unknown Source)
                                            void doRetain()
at android.support.v4.app.LoaderManagerImpl.android.support.v4.content.Loader restartLoader(int,android.os.Bundle,android.support.v4.app.LoaderManager$LoaderCallbacks)(Unknown Source)
                                            void doStart()
at com.murrayc.galaxyzoo.app.ClassifyFragment.void update()(Unknown Source)
at com.murrayc.galaxyzoo.app.ClassifyActivity.void startNextClassification()(Unknown Source)
at com.murrayc.galaxyzoo.app.ClassifyActivity.void onClassificationFinished()(Unknown Source)
at com.murrayc.galaxyzoo.app.QuestionFragment$SaveClassificationTask.java.lang.Void doInBackground(java.lang.Void[])(Unknown Source)
                                                                     void onPostExecute(java.lang.Void)
at com.murrayc.galaxyzoo.app.QuestionFragment$SaveClassificationTask.void onPostExecute(java.lang.Object)(Unknown Source)
at android.os.AsyncTask.finish(AsyncTask.java:632)
at android.os.AsyncTask.access$600(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5212)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
at dalvik.system.NativeStart.main(Native Method)
murraycu commented 9 years ago

Actually, this recent stacktrace doesn't involve AlertDialog.show().

murraycu commented 9 years ago

This is hopefully fixed by this (reverting) commit: https://github.com/murraycu/android-galaxyzoo/commit/7800631dba3c357c5bc6e2817098a229bf430e4a

murraycu commented 9 years ago

Here's another stacktrace from version 1.35 which looks like a duplicate, and was presumably fixed by this.

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.void checkStateLoss()(Unknown Source)
at android.support.v4.app.FragmentManagerImpl.void throwException(java.lang.RuntimeException)(Unknown Source)
                                              android.support.v4.app.FragmentTransaction beginTransaction()
                                              void putFragment(android.os.Bundle,java.lang.String,android.support.v4.app.Fragment)
                                              android.support.v4.app.Fragment getFragment(android.os.Bundle,java.lang.String)
                                              void dump(java.lang.String,java.io.FileDescriptor,java.io.PrintWriter,java.lang.String[])
                                              android.view.animation.Animation makeOpenCloseAnimation(android.content.Context,float,float,float,float)
                                              android.view.animation.Animation makeFadeAnimation(android.content.Context,float,float)
                                              android.view.animation.Animation loadAnimation(android.support.v4.app.Fragment,int,boolean,int)
                                              void performPendingDeferredStart(android.support.v4.app.Fragment)
                                              void moveToState(android.support.v4.app.Fragment,int,int,int,boolean)
                                              void moveToState(int,boolean)
                                              void moveToState(int,int,int,boolean)
                                              void addFragment(android.support.v4.app.Fragment,boolean)
                                              void removeFragment(android.support.v4.app.Fragment,int,int)
                                              android.support.v4.app.Fragment findFragmentById(int)
                                              android.support.v4.app.Fragment findFragmentByTag(java.lang.String)
                                              void enqueueAction(java.lang.Runnable,boolean)
                                              int allocBackStackIndex(android.support.v4.app.BackStackRecord)
                                              void setBackStackIndex(int,android.support.v4.app.BackStackRecord)
                                              boolean popBackStackState(android.os.Handler,java.lang.String,int,int)
                                              void restoreAllState(android.os.Parcelable,java.util.ArrayList)
                                              void attachActivity(android.support.v4.app.FragmentActivity,android.support.v4.app.FragmentContainer,android.support.v4.app.Fragment)
                                              void dispatchConfigurationChanged(android.content.res.Configuration)
                                              boolean dispatchCreateOptionsMenu(android.view.Menu,android.view.MenuInflater)
                                              boolean dispatchPrepareOptionsMenu(android.view.Menu)
                                              boolean dispatchOptionsItemSelected(android.view.MenuItem)
at android.support.v4.app.BackStackRecord.void dump(java.lang.String,java.io.FileDescriptor,java.io.PrintWriter,java.lang.String[])(Unknown Source)
                                          void dump(java.lang.String,java.io.PrintWriter,boolean)
                                          void addOp(android.support.v4.app.BackStackRecord$Op)
                                          android.support.v4.app.FragmentTransaction add(int,android.support.v4.app.Fragment,java.lang.String)
                                          void doAddOp(int,android.support.v4.app.Fragment,java.lang.String,int)
                                          android.support.v4.app.FragmentTransaction replace(int,android.support.v4.app.Fragment)
                                          android.support.v4.app.FragmentTransaction hide(android.support.v4.app.Fragment)
                                          void bumpBackStackNesting(int)
                                          int commit()
                                          int commitInternal(boolean)
                                          void setFirstOut(android.util.SparseArray,android.support.v4.app.Fragment)
                                          void calculateBackFragments(android.util.SparseArray,android.util.SparseArray)
                                          android.support.v4.app.BackStackRecord$TransitionState popFromBackStack(boolean,android.support.v4.app.BackStackRecord$TransitionState,android.util.SparseArray,android.util.SparseArray)
                                          android.support.v4.app.BackStackRecord$TransitionState beginTransition(android.util.SparseArray,android.util.SparseArray,boolean)
                                          java.lang.Object getEnterTransition(android.support.v4.app.Fragment,boolean)
                                          java.lang.Object getSharedElementTransition(android.support.v4.app.Fragment,android.support.v4.app.Fragment,boolean)
                                          java.lang.Object captureExitingViews(java.lang.Object,android.support.v4.app.Fragment,java.util.ArrayList,android.support.v4.util.ArrayMap)
                                          android.support.v4.util.ArrayMap remapSharedElements(android.support.v4.app.BackStackRecord$TransitionState,android.support.v4.app.Fragment,boolean)
                                          boolean configureTransitions(int,android.support.v4.app.BackStackRecord$TransitionState,boolean,android.util.SparseArray,android.util.SparseArray)
                                          void prepareSharedElementTransition(android.support.v4.app.BackStackRecord$TransitionState,android.view.View,java.lang.Object,android.support.v4.app.Fragment,android.support.v4.app.Fragment,boolean,java.util.ArrayList)
                                          void callSharedElementEnd(android.support.v4.app.BackStackRecord$TransitionState,android.support.v4.app.Fragment,android.support.v4.app.Fragment,boolean,android.support.v4.util.ArrayMap)
                                          void setEpicenterIn(android.support.v4.util.ArrayMap,android.support.v4.app.BackStackRecord$TransitionState)
                                          android.support.v4.util.ArrayMap mapSharedElementsIn(android.support.v4.app.BackStackRecord$TransitionState,boolean,android.support.v4.app.Fragment)
                                          android.support.v4.util.ArrayMap remapNames(java.util.ArrayList,java.util.ArrayList,android.support.v4.util.ArrayMap)
                                          void excludeHiddenFragmentsAfterEnter(android.view.View,android.support.v4.app.BackStackRecord$TransitionState,int,java.lang.Object)
                                          void excludeHiddenFragments(android.support.v4.app.BackStackRecord$TransitionState,int,java.lang.Object)
                                          void setNameOverride(android.support.v4.util.ArrayMap,java.lang.String,java.lang.String)
                                          void setNameOverrides(android.support.v4.app.BackStackRecord$TransitionState,java.util.ArrayList,java.util.ArrayList)
                                          void setBackNameOverrides(android.support.v4.app.BackStackRecord$TransitionState,android.support.v4.util.ArrayMap,boolean)
                                          android.support.v4.util.ArrayMap access$000(android.support.v4.app.BackStackRecord,android.support.v4.app.BackStackRecord$TransitionState,boolean,android.support.v4.app.Fragment)
                                          void access$100(android.support.v4.app.BackStackRecord,android.support.v4.util.ArrayMap,android.support.v4.app.BackStackRecord$TransitionState)
                                          void access$200(android.support.v4.app.BackStackRecord,android.support.v4.app.BackStackRecord$TransitionState,android.support.v4.app.Fragment,android.support.v4.app.Fragment,boolean,android.support.v4.util.ArrayMap)
                                          void access$300(android.support.v4.app.BackStackRecord,android.support.v4.app.BackStackRecord$TransitionState,int,java.lang.Object)
at android.support.v4.app.BackStackRecord.void dump(java.lang.String,java.io.FileDescriptor,java.io.PrintWriter,java.lang.String[])(Unknown Source)
                                          void dump(java.lang.String,java.io.PrintWriter,boolean)
                                          void addOp(android.support.v4.app.BackStackRecord$Op)
                                          android.support.v4.app.FragmentTransaction add(int,android.support.v4.app.Fragment,java.lang.String)
                                          void doAddOp(int,android.support.v4.app.Fragment,java.lang.String,int)
                                          android.support.v4.app.FragmentTransaction replace(int,android.support.v4.app.Fragment)
                                          android.support.v4.app.FragmentTransaction hide(android.support.v4.app.Fragment)
                                          void bumpBackStackNesting(int)
                                          int commit()
                                          int commitInternal(boolean)
                                          void setFirstOut(android.util.SparseArray,android.support.v4.app.Fragment)
                                          void calculateBackFragments(android.util.SparseArray,android.util.SparseArray)
                                          android.support.v4.app.BackStackRecord$TransitionState popFromBackStack(boolean,android.support.v4.app.BackStackRecord$TransitionState,android.util.SparseArray,android.util.SparseArray)
                                          android.support.v4.app.BackStackRecord$TransitionState beginTransition(android.util.SparseArray,android.util.SparseArray,boolean)
                                          java.lang.Object getEnterTransition(android.support.v4.app.Fragment,boolean)
                                          java.lang.Object getSharedElementTransition(android.support.v4.app.Fragment,android.support.v4.app.Fragment,boolean)
                                          java.lang.Object captureExitingViews(java.lang.Object,android.support.v4.app.Fragment,java.util.ArrayList,android.support.v4.util.ArrayMap)
                                          android.support.v4.util.ArrayMap remapSharedElements(android.support.v4.app.BackStackRecord$TransitionState,android.support.v4.app.Fragment,boolean)
                                          boolean configureTransitions(int,android.support.v4.app.BackStackRecord$TransitionState,boolean,android.util.SparseArray,android.util.SparseArray)
                                          void prepareSharedElementTransition(android.support.v4.app.BackStackRecord$TransitionState,android.view.View,java.lang.Object,android.support.v4.app.Fragment,android.support.v4.app.Fragment,boolean,java.util.ArrayList)
                                          void callSharedElementEnd(android.support.v4.app.BackStackRecord$TransitionState,android.support.v4.app.Fragment,android.support.v4.app.Fragment,boolean,android.support.v4.util.ArrayMap)
                                          void setEpicenterIn(android.support.v4.util.ArrayMap,android.support.v4.app.BackStackRecord$TransitionState)
                                          android.support.v4.util.ArrayMap mapSharedElementsIn(android.support.v4.app.BackStackRecord$TransitionState,boolean,android.support.v4.app.Fragment)
                                          android.support.v4.util.ArrayMap remapNames(java.util.ArrayList,java.util.ArrayList,android.support.v4.util.ArrayMap)
                                          void excludeHiddenFragmentsAfterEnter(android.view.View,android.support.v4.app.BackStackRecord$TransitionState,int,java.lang.Object)
                                          void excludeHiddenFragments(android.support.v4.app.BackStackRecord$TransitionState,int,java.lang.Object)
                                          void setNameOverride(android.support.v4.util.ArrayMap,java.lang.String,java.lang.String)
                                          void setNameOverrides(android.support.v4.app.BackStackRecord$TransitionState,java.util.ArrayList,java.util.ArrayList)
                                          void setBackNameOverrides(android.support.v4.app.BackStackRecord$TransitionState,android.support.v4.util.ArrayMap,boolean)
                                          android.support.v4.util.ArrayMap access$000(android.support.v4.app.BackStackRecord,android.support.v4.app.BackStackRecord$TransitionState,boolean,android.support.v4.app.Fragment)
                                          void access$100(android.support.v4.app.BackStackRecord,android.support.v4.util.ArrayMap,android.support.v4.app.BackStackRecord$TransitionState)
                                          void access$200(android.support.v4.app.BackStackRecord,android.support.v4.app.BackStackRecord$TransitionState,android.support.v4.app.Fragment,android.support.v4.app.Fragment,boolean,android.support.v4.util.ArrayMap)
                                          void access$300(android.support.v4.app.BackStackRecord,android.support.v4.app.BackStackRecord$TransitionState,int,java.lang.Object)
at com.murrayc.galaxyzoo.app.ClassifyFragment.void showChildFragments(boolean)(Unknown Source)
at com.murrayc.galaxyzoo.app.ClassifyFragment.void showLoadingInProgress(boolean)(Unknown Source)
at com.murrayc.galaxyzoo.app.ClassifyFragment.void onAttach(android.app.Activity)(Unknown Source)
                                              android.view.View onCreateView(android.view.LayoutInflater,android.view.ViewGroup,android.os.Bundle)
                                              void onCreateOptionsMenu(android.view.Menu,android.view.MenuInflater)
                                              android.support.v4.content.Loader onCreateLoader(int,android.os.Bundle)
                                              void onLoadFinished(android.support.v4.content.Loader,android.database.Cursor)
                                              void onLoaderReset(android.support.v4.content.Loader)
                                              void onLoadFinished(android.support.v4.content.Loader,java.lang.Object)
at android.support.v4.app.LoaderManagerImpl.android.support.v4.app.LoaderManagerImpl$LoaderInfo createLoader(int,android.os.Bundle,android.support.v4.app.LoaderManager$LoaderCallbacks)(Unknown Source)
                                            void doStop()
at android.support.v4.app.LoaderManagerImpl.android.support.v4.app.LoaderManagerImpl$LoaderInfo createAndInstallLoader(int,android.os.Bundle,android.support.v4.app.LoaderManager$LoaderCallbacks)(Unknown Source)
                                            void doRetain()
at android.support.v4.app.LoaderManagerImpl.android.support.v4.content.Loader restartLoader(int,android.os.Bundle,android.support.v4.app.LoaderManager$LoaderCallbacks)(Unknown Source)
                                            void doStart()
at com.murrayc.galaxyzoo.app.ClassifyFragment.void update()(Unknown Source)
at com.murrayc.galaxyzoo.app.ClassifyActivity.void startNextClassification()(Unknown Source)
at com.murrayc.galaxyzoo.app.ClassifyActivity.void onClassificationFinished()(Unknown Source)
at com.murrayc.galaxyzoo.app.QuestionFragment$SaveClassificationTask.java.lang.Void doInBackground(java.lang.Void[])(Unknown Source)
                                                                     void onPostExecute(java.lang.Void)
at com.murrayc.galaxyzoo.app.QuestionFragment$SaveClassificationTask.void onPostExecute(java.lang.Object)(Unknown Source)
at android.os.AsyncTask.finish(AsyncTask.java:632)
at android.os.AsyncTask.access$600(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5356)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
at dalvik.system.NativeStart.main(Native Method)