简体   繁体   中英

Fragment Crash on Activity destroyed

I am facing this particular crash on few devices

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)

What I am doing is am loading a Fragment to an Activity using an Async method.

I can not recreate this error in my side but have seen this issue in many devices. Can any one help me out with this error?

Here's the code snippet :-

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) {}
}

And this is how I am calling the Fragment :-

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

First of all you should be familiar with the activity lifecycle .
I think that your AsynkTask finishes when activity is destroyed and that's why you cannot perform any fragment transaction. You may add condition before this transaction:

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

Hope it'll help.

But if you're using AsynkTask only to add fragment - this is incorrect. Just add your fragment in the onCreate method without any additional code.

edit:

You cannot perform UI operations in the doInBackground method because it's running not in the UI thread. Move Ui-specific code to onPostExecute method and it'll work. And do not forget about isFinishing() condition. Also you should cancel all your AsyncTasks in Activity.onBackPressed() method to avoid such problems.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM