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 with CONNECTIVITY_CHANGE: "Error receiving broadcast Intent" #21

Closed murraycu closed 9 years ago

murraycu commented 9 years ago

A user reported this crash on Android 5.0 with version 1.45 after classifying 5 subjects. It looks like it was triggered by a change of network connectivity.

java.lang.RuntimeException: Error receiving broadcast Intent { act=android.net.conn.CONNECTIVITY_CHANGE flg=0x4000010 (has extras) } in com.murrayc.galaxyzoo.app.g@2505d2ff
at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:872)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693)
Caused by: 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)
                                              android.view.View onCreateView(android.view.View,java.lang.String,android.content.Context,android.util.AttributeSet)
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.view.View)
                                          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.view.View)
                                          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 access$500(com.murrayc.galaxyzoo.app.ClassifyActivity)(Unknown Source)
at com.murrayc.galaxyzoo.app.ClassifyActivity$5.void onReceive(android.content.Context,android.content.Intent)(Unknown Source)
at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:862)
... 8 more
murraycu commented 9 years ago

This commit should fix this, though it's hard to be sure because it's hard to reproduce these problems: https://github.com/murraycu/android-galaxyzoo/commit/bb9771ee629a1270254621f8be5d7fd77947761e