2

I have an activity (FragmentActivity) that handles user registration. On a button click a DialogFragment is shown while the task is handled asynchronously in the activity. Then after the task has been handled, the FragmentDialog is dismissed. Everything works smoothly, even with configuration changes like changing orientation, but i discovered that if i pressed the home button while the background task is running, the app crashes at the point where it tries to dismiss the FragmentDialog and when i restart the app, i find the dialog is still running.

I searched and found lots of discussions, solutions and workarounds, here, here and here. But i have not been able to implement any of them to solve my problem.

Here's what i'm working with:

Method called on button click for signing up user:

    private void startRegDialog(final String phoneNumber, String password) {
    Log.i("tag", "startregdailog called");

    verifiedUser = false;

            //start Dialog fragment here.
    final SignUpDialogFragment mDialogFragment = SignUpDialogFragment.newInstance();
    mDialogFragment.show(getSupportFragmentManager(), "dailogFragment");

    ParseUser CreateNewUser = new ParseUser();

    CreateNewUser.setUsername(phoneNumber);
    CreateNewUser.setPassword(password);
    CreateNewUser.put("userVerified", verifiedUser);
    Log.i("tag", "starting task");

    CreateNewUser.signUpInBackground(new SignUpCallback() {

        @Override
        public void done(ParseException e) {
            Log.i("tag", "task done");

               //Dismiss Dialog after receiving result

            if(mDialogFragment !=null){
            mDialogFragment.dismiss();
            }

            if(e != null){
                Log.i("Tag", "user not Created");
                String errorMessage = e.getMessage().toString();
                onError(errorMessage);

            } 
            else {
                Log.i("Tag", "userSuccessfully Created");
                Intent VerifyAccount = new Intent(context, VerifyAccount.class);
                VerifyAccount.putExtra("phoneNo", phoneNumber);
                startActivity(VerifyAccount);
            }
        }
    });
}

HERE IS THE LOGCAT OUTPUT

  03-17 22:12:40.070: E/AndroidRuntime(16000): FATAL EXCEPTION: main
  03-17 22:12:40.070: E/AndroidRuntime(16000): java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
  03-17 22:12:40.070: E/AndroidRuntime(16000):  at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1343)
  03-17 22:12:40.070: E/AndroidRuntime(16000):  at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1361)
  03-17 22:12:40.070: E/AndroidRuntime(16000):  at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
  03-17 22:12:40.070: E/AndroidRuntime(16000):  at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)
  03-17 22:12:40.070: E/AndroidRuntime(16000):  at android.support.v4.app.DialogFragment.dismissInternal(DialogFragment.java:189)
  03-17 22:12:40.070: E/AndroidRuntime(16000):  at android.support.v4.app.DialogFragment.dismiss(DialogFragment.java:155)
  03-17 22:12:40.070: E/AndroidRuntime(16000):  at com.example.razcat.CreateAccount$3.done(CreateAccount.java:273)
  03-17 22:12:40.070: E/AndroidRuntime(16000):  at com.parse.SignUpCallback.internalDone(SignUpCallback.java:39)
  03-17 22:12:40.070: E/AndroidRuntime(16000):  at com.parse.SignUpCallback.internalDone(SignUpCallback.java:1)
  03-17 22:12:40.070: E/AndroidRuntime(16000):  at com.parse.Parse$6$1.run(Parse.java:834)
  03-17 22:12:40.070: E/AndroidRuntime(16000):  at android.os.Handler.handleCallback(Handler.java:615)
  03-17 22:12:40.070: E/AndroidRuntime(16000):  at android.os.Handler.dispatchMessage(Handler.java:92)
  03-17 22:12:40.070: E/AndroidRuntime(16000):  at android.os.Looper.loop(Looper.java:155)
  03-17 22:12:40.070: E/AndroidRuntime(16000):  at android.app.ActivityThread.main(ActivityThread.java:5454)
  03-17 22:12:40.070: E/AndroidRuntime(16000):  at java.lang.reflect.Method.invokeNative(Native Method)
  03-17 22:12:40.070: E/AndroidRuntime(16000):  at java.lang.reflect.Method.invoke(Method.java:511)
  03-17 22:12:40.070: E/AndroidRuntime(16000):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1029)
  03-17 22:12:40.070: E/AndroidRuntime(16000):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:796)
  03-17 22:12:40.070: E/AndroidRuntime(16000):  at dalvik.system.NativeStart.main(Native Method)

 Please any help would be useful thanks. 
Community
  • 1
  • 1
bibi_bryan
  • 371
  • 3
  • 17

1 Answers1

0

For removing Dialog Fragment, you need to call it by it's tag and then only you can dismiss it. In your case you have taken "dailogFragment" as a tag.

mDialogFragment.show(getSupportFragmentManager(), "dailogFragment");

So Now For removing it first call it by its tag like below :

Fragment mDialogFragment= getSupportFragmentManager().findFragmentByTag("dailogFragment");
//then check if it's null
    if (mDialogFragment!= null) {
        DialogFragment df = (DialogFragment) mDialogFragment;
//Now dismiss.
        df.dismiss();
    }
TheLittleNaruto
  • 8,325
  • 4
  • 54
  • 73