2017-06-30 2 views
-1

Je suis en train de commencer fragment et fermer après quelques secondes, mais je suis arrivé l'erreur:Impossible de fermer Fragment à l'intérieur Handler se IllegalStateException

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

Le code qui produit exception est la suivante:

FragmentManager manager = getSupportFragmentManager(); 

     fragment = new MediaControlFragment(); 


     manager.beginTransaction() 
       .add(R.id.media_control_frame, fragment) 
       .commit(); 

     handler = new Handler(); 
     handler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       //do something again 
       Log.i(PLAYER_ACTIVITY_TAG, "DESTROYING FRAGMENT"); 

       manager.beginTransaction().remove(fragment).commit(); 
         } 
     }, 3500); 

Maintenant j'ai l'erreur sur la ligne où le fragment devrait être enlevé.

Quelqu'un peut-il m'aider à atteindre cet objectif?

EDIT:

LOG:

E/AndroidRuntime: FATAL EXCEPTION: main 
Process: PID: 28254 
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1842) 
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1860) 
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:650) 
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:609) 
at aoc.netcast.rs.android_ott_client.activities.PlayerActivity$1.run(PlayerActivity.java:150) 
at android.os.Handler.handleCallback(Handler.java:769) 
at android.os.Handler.dispatchMessage(Handler.java:98) 
at android.os.Looper.loop(Looper.java:164) 
at android.app.ActivityThread.main(ActivityThread.java:6540) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 
+0

veuillez mettre le journal complet et la méthode. – NehaK

+0

La méthode ci-dessus, elle est exécutée dans la méthode ** onCreate ** en activité. et le journal est ajouté dans la section d'édition de la question. – hogar

+0

pouvez-vous s'il vous plaît ajouter votre méthode onCreate complète? – NehaK

Répondre

0

J'ai essayé votre code et cela fonctionne très bien pour moi:

final FragmentManager manager = getSupportFragmentManager(); 

    final SomeFragment fragment = new SomeFragment(); 


    manager.beginTransaction() 
      .add(R.id.frame, fragment) 
      .commit(); 
//R.id.frame is frame layout. 


    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      //do something again 
      manager.beginTransaction().remove(fragment).commit(); 
     } 
    }, 3500); 

Essayez d'utiliser "CommitAllowingStateLoss()" au lieu de "commit()".

+0

Salut, s'il vous plaît pouvez-vous regarder mon journal que j'ai ajouté dans la section EDIT. Je ne sais pas je suis en cours d'exécution dans cette exception. – hogar

+0

à partir de vos journaux, tout ce que je peux dire est que cette erreur se produit en raison de cette ligne.'java.lang.IllegalStateException: Impossible d'effectuer cette action après onSaveInstanceState 'Vérifiez les erreurs dans votre méthode' onCreate' –

+0

en fonction de la erreur cette ligne provoque l'exception: 'manager.beginTransaction(). remove (fragment) .commit();' – hogar

0

Vous ne pouvez pas le faire à partir d'un ... runnable d'abord obtenir l'activité du fragment en utilisant getActivity(), puis avec l'activité, procédez comme suit

activity.runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
       //your code here which you want to perform in UI 
       } 
      }); 

espérons qu'il vous aidera

+0

Je n'ai pas mentionné, ce code a été exécuté dans l'activité, pas dans le fragment. – hogar

1

Selon votre Code: https://pastebin.com/snbxaGct

vous obtenez cette erreur parce que vous avez appelé HomeActivity en appelant

startActivity(new Intent(this, HomeActivity.class)); 

puis lorsque vous ajoutez ou supprimez un fragment de PlayerActivity, il génère une erreur, car vous êtes passé à une autre activité HomeActivity.