2016-09-28 1 views
0

Ich bin vor diesem besonderen Absturz auf wenige GeräteFragment Absturz auf Tierbew zerstört

Fatal Exception: java.lang.RuntimeException: An error occurred while executing doInBackground() 
     at android.os.AsyncTask$3.done(AsyncTask.java:309) 
     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) 
     at java.util.concurrent.FutureTask.setException(FutureTask.java:223) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
     at java.lang.Thread.run(Thread.java:818) 
Caused by java.lang.IllegalStateException: Activity has been destroyed 
     at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1515) 
     at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:634) 
     at android.support.v4.app.BackStackRecord.commitAllowingStateLoss(BackStackRecord.java:617) 
     at net.trellisys.papertrell.components.mediagallery.MGBaseActivity$initQuickControls.doInBackground(MGBaseActivity.java:136) 
     at net.trellisys.papertrell.components.mediagallery.MGBaseActivity$initQuickControls.doInBackground(MGBaseActivity.java:1) 
     at android.os.AsyncTask$2.call(AsyncTask.java:295) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
     at java.lang.Thread.run(Thread.java:818) 

Was ich tue, wird geladen bin ein Fragment auf ein Activity eine Async Methode.

Ich kann diesen Fehler in meiner Seite nicht neu erstellen, aber dieses Problem in vielen Geräten gesehen. Kann mir jemand mit diesem Fehler helfen?

Hier ist der Code-Schnipsel: -

public class initQuickControls extends AsyncTask<String,Void,String> { 
    String fromPage = ""; 
    public initQuickControls(String from){ 
     fromPage = from; 
    } 
    QuickControlsFragment quicFrag = null; 
    @Override 
    protected String doInBackground(String... strings) { 
     quicFrag = new QuickControlsFragment(fromPage); 
     FragmentManager fragManager = getSupportFragmentManager(); 
     fragManager.beginTransaction().replace(R.id.quickcontrols_container,quicFrag).commitAllowingStateLoss(); 
     return "EXECUTED"; 
    } 

    protected void onPostExecute(String result) {} 
} 

Und das ist, wie ich die Fragment nenne: -

new initQuickControls("List").execute(""); 
+0

Was machst du im besagten Rückruf (auf Aktivität zerstört) - kannst du vielleicht den Code anzeigen? – ishmaelMakitla

+1

Die Antwort ist einfach. Verwenden Sie AsyncTask nicht, um das Fragment in die Aktivität –

+0

@ РоманДрогомирецький zu laden. Sie sagen also, fügen Sie es einfach direkt hinzu. Aber was ist das Problem hier? –

Antwort

2

Zunächst einmal sollten Sie mit dem activity lifecycle vertraut sein.
Ich denke, dass Ihre AsynkTask beendet wird, wenn die Aktivität zerstört wird, und deshalb können Sie keine Fragment-Transaktion ausführen. Sie können Bedingung vor dieser Transaktion hinzufügen:

if (!MainActivity.this.isFinishing()) {...} 

Ich hoffe, es wird Ihnen helfen.

Aber wenn Sie nur AsynkTask Fragment hinzufügen - das ist falsch. Fügen Sie einfach Ihr Fragment in der onCreate Methode ohne zusätzlichen Code hinzu.

edit:

Sie können nicht UI-Operationen im doInBackground Verfahren durchführen, da es nicht in dem UI-Thread ausgeführt wird. Verschieben Ui-spezifischen Code zu onPostExecute Methode und es wird funktionieren. Und vergessen Sie nicht isFinishing() Zustand. Auch sollten Sie alle Ihre AsyncTasks in Activity.onBackPressed() Methode abbrechen, um solche Probleme zu vermeiden.

+0

Ja, ich habe diesen Code derzeit hinzugefügt. Aber ich bin mir nicht sicher, wie man dieses Problem neu erstellen kann –

+0

@NidhinPrathap es ist schwer, Ihnen zu helfen, den Code nicht zu sehen – rocknow

+0

Haben Sie den Beitrag mit Code aktualisiert. es ist nur ein einfacher Anruf –

Verwandte Themen