App crashes when started again for a second time

萝らか妹 提交于 2020-01-14 03:31:09

问题


I am currently porting an Iphone app to Android and as I had no clue of fragments I thought I gonna try it with them, so I created several classes (one for each view thats presented to the user, all extending baseclass Fragment) and the respective xml layouts. Code below for the fragment that's shown on launch. I use a singleton for every fragment.

public class FragWelcome extends Fragment {

private static FragWelcome _fs;

OnClickListener mListener;

public FragWelcome() {}

public static FragWelcome getFrag() {
    if(FragWelcome._fs==null) _fs=new FragWelcome();
    return _fs;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    try {
        mListener = (OnClickListener) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString() + " must implement OnClickListener");
    }
}

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  View v = inflater.inflate(R.layout.frag_welcome, container, false);
  ((Button)v.findViewById(R.id.btnCreateNewList)).setOnClickListener(mListener);
  ((Button)v.findViewById(R.id.btnEditOldList)).setOnClickListener(mListener);
  return v;
}
}

I then have my Fragment Manager Class with methods like those :

    public void addFragment(int container, Fragment f,int fadein,int fadeout, boolean addtobackstack,String tag) {

        this._currentFragment=f;
        this._fragTrans=this._fragMan.beginTransaction();
        this._fragTrans.setCustomAnimations(fadein, fadeout);
        this._fragTrans.add(container, f ,tag);
        if(addtobackstack) this._fragTrans.addToBackStack(tag);
        this._fragTrans.commit();

}
public void replaceFragment(int container, Fragment f,int fadein,int fadeout, boolean addtobackstack,String tag) {

        this._currentFragment=f;
        this._fragTrans=this._fragMan.beginTransaction();
        this._fragTrans.setCustomAnimations(fadein, fadeout);
        this._fragTrans.replace(container, f ,tag);
        if(addtobackstack) this._fragTrans.addToBackStack(tag);
        this._fragTrans.commit();

}

This is the onCreate method of my main activity class AC_Main.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.ac_main);
    this.setTitle("Willkommen");

    FragMan.getSharedFragMan(this).addFragment(R.id.llMain,FragWelcome.getFrag(),R.animator.fade_in,R.animator.fade_out,false,"frag_welcome");  

}

What can I say....everything works as expected, just excellent. No errors at all... as long as I don't try to START THE APP FOR A SECOND TIME.

08-21 16:27:18.278: D/AndroidRuntime(21576): Shutting down VM
08-21 16:27:18.278: W/dalvikvm(21576): threadid=1: thread exiting with uncaught exception (group=0x40c351f8)
08-21 16:27:18.283: E/AndroidRuntime(21576): FATAL EXCEPTION: main
08-21 16:27:18.283: E/AndroidRuntime(21576): java.lang.RuntimeException: Unable to start     activity ComponentInfo{de.lochmann.einkaufsliste/de.lochmann.einkaufsliste.AC_Main}: j     java.lang.IllegalStateException: Activity has been destroyed
08-21 16:27:18.283: E/AndroidRuntime(21576):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1968)
08-21 16:27:18.283: E/AndroidRuntime(21576):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1993)
08-21 16:27:18.283: E/AndroidRuntime(21576):    at android.app.ActivityThread.access$600(ActivityThread.java:127)
08-21 16:27:18.283: E/AndroidRuntime(21576):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1159)
08-21 16:27:18.283: E/AndroidRuntime(21576):    at android.os.Handler.dispatchMessage(Handler.java:99)
08-21 16:27:18.283: E/AndroidRuntime(21576):    at android.os.Looper.loop(Looper.java:137)
08-21 16:27:18.283: E/AndroidRuntime(21576):    at android.app.ActivityThread.main(ActivityThread.java:4507)
08-21 16:27:18.283: E/AndroidRuntime(21576):    at java.lang.reflect.Method.invokeNative(Native Method)
08-21 16:27:18.283: E/AndroidRuntime(21576):    at java.lang.reflect.Method.invoke(Method.java:511)
08-21 16:27:18.283: E/AndroidRuntime(21576):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
08-21 16:27:18.283: E/AndroidRuntime(21576):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
08-21 16:27:18.283: E/AndroidRuntime(21576):    at dalvik.system.NativeStart.main(Native Method)
08-21 16:27:18.283: E/AndroidRuntime(21576): Caused by: java.lang.IllegalStateException: Activity has been destroyed
08-21 16:27:18.283: E/AndroidRuntime(21576):    at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1280)
08-21 16:27:18.283: E/AndroidRuntime(21576):    at android.app.BackStackRecord.commitInternal(BackStackRecord.java:541)
08-21 16:27:18.283: E/AndroidRuntime(21576):    at android.app.BackStackRecord.commit(BackStackRecord.java:525)
08-21 16:27:18.283: E/AndroidRuntime(21576):    at de.lochmann.einkaufsliste.FragMan.addFragment(FragMan.java:41)
08-21 16:27:18.283: E/AndroidRuntime(21576):    at de.lochmann.einkaufsliste.AC_Main.onCreate(AC_Main.java:124)
08-21 16:27:18.283: E/AndroidRuntime(21576):    at android.app.Activity.performCreate(Activity.java:4465)
08-21 16:27:18.283: E/AndroidRuntime(21576):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1052)
08-21 16:27:18.283: E/AndroidRuntime(21576):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1932)
08-21 16:27:18.283: E/AndroidRuntime(21576):    ... 11 more

So again, everything works fine when I start the app from Eclipse, the app is totally stable, until I press the home button of my Android device (Samsung Galaxy S2) and I get back to my apps. When I try to start the app again it crashes with said error. The task manager says it's not running in background anymore. So my question is...what am I doing wrong, anybody has any ideas or experiences of your own?? Thanks a lot.

I just found out if I have the app crash at the second time and my device tells me it stopped the app, I can run the app normally again at the third try. Maybe it is still in background an the fragments are causing trouble...!?

Edit, new LogCat Output after I implemented each and every lifecycle method and I called all super methods.

08-21 17:17:09.043: I/dalvikvm(25725): Turning on JNI app bug workarounds for target SDK version 10...
08-21 17:17:09.108: I/Activity(25725): onCreate called
08-21 17:17:09.108: I/FragWelcome(25725): onAttach called
08-21 17:17:09.108: I/FragWelcome(25725): onCreate called
08-21 17:17:09.123: D/dalvikvm(25725): GC_FOR_ALLOC freed 86K, 3% free 8909K/9091K, paused 13ms
08-21 17:17:09.128: I/dalvikvm-heap(25725): Grow heap (frag case) to 11.061MB for 2432016-byte allocation
08-21 17:17:09.148: D/dalvikvm(25725): GC_CONCURRENT freed 1K, 3% free 11282K/11527K, paused 1ms+1ms
08-21 17:17:09.203: D/dalvikvm(25725): GC_FOR_ALLOC freed 0K, 3% free 11283K/11527K, paused 11ms
08-21 17:17:09.208: I/dalvikvm-heap(25725): Grow heap (frag case) to 16.278MB for 5472016-byte allocation
08-21 17:17:09.228: D/dalvikvm(25725): GC_CONCURRENT freed 0K, 2% free 16626K/16903K, paused 1ms+2ms
08-21 17:17:09.318: I/FragWelcome(25725): onCreateView called
08-21 17:17:09.318: I/FragWelcome(25725): onActivityCreated called
08-21 17:17:09.323: I/Activity(25725): onStart called
08-21 17:17:09.323: I/FragWelcome(25725): onStart called
08-21 17:17:09.323: I/Activity(25725): onResume called
08-21 17:17:09.323: I/FragWelcome(25725): onResume called
08-21 17:17:09.503: D/CLIPBOARD(25725): Hide Clipboard dialog at Starting input: finished by someone else... !
08-21 17:17:21.258: I/FragWelcome(25725): onPause called
08-21 17:17:21.258: I/Activity(25725): onPause called
08-21 17:17:21.438: D/CLIPBOARD(25725): Hide Clipboard dialog at Starting input: finished by someone else... !
08-21 17:17:21.908: I/FragWelcome(25725): onStop called
08-21 17:17:21.908: I/Activity(25725): onStop called
08-21 17:17:21.908: I/FragWelcome(25725): onDestroyView called
08-21 17:17:21.908: I/FragWelcome(25725): onDestroy called
08-21 17:17:21.913: I/FragWelcome(25725): onDetach called
08-21 17:17:21.913: I/Activity(25725): onDestroy called
08-21 17:17:32.833: I/Activity(25725): onCreate called
08-21 17:17:32.833: D/AndroidRuntime(25725): Shutting down VM
08-21 17:17:32.833: W/dalvikvm(25725): threadid=1: thread exiting with uncaught exception (group=0x40c351f8)
08-21 17:17:32.838: E/AndroidRuntime(25725): FATAL EXCEPTION: main
08-21 17:17:32.838: E/AndroidRuntime(25725): java.lang.RuntimeException: Unable to start activity ComponentInfo{de.lochmann.einkaufsliste/de.lochmann.einkaufsliste.AC_Main}: java.lang.IllegalStateException: Activity has been destroyed
08-21 17:17:32.838: E/AndroidRuntime(25725):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1968)
08-21 17:17:32.838: E/AndroidRuntime(25725):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1993)
08-21 17:17:32.838: E/AndroidRuntime(25725):    at android.app.ActivityThread.access$600(ActivityThread.java:127)

What I read from the former logcat is some problem with the backstackrecord.commit ... anybody knows anything about this?

08-21 16:27:18.283: E/AndroidRuntime(21576): Caused by: java.lang.IllegalStateException: Activity has been destroyed
08-21 16:27:18.283: E/AndroidRuntime(21576):    at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1280)
08-21 16:27:18.283: E/AndroidRuntime(21576):    at android.app.BackStackRecord.commitInternal(BackStackRecord.java:541)
08-21 16:27:18.283: E/AndroidRuntime(21576):    at android.app.BackStackRecord.commit(BackStackRecord.java:525)
08-21 16:27:18.283: E/AndroidRuntime(21576):    at de.lochmann.einkaufsliste.FragMan.addFragment(FragMan.java:41)
08-21 16:27:18.283: E/AndroidRuntime(21576):    at de.lochmann.einkaufsliste.AC_Main.onCreate(AC_Main.java:124)

回答1:


When you press the home button your app goes to sleep essentially it does not close. However since you have no pause or resume methods in your activity when you "re-launch" you are actually opening up the original instance of the application. This is causing the error:

 Caused by: java.lang.IllegalStateException: Activity has been destroyed

Since your Activity is no longer available.




回答2:


I have the same issue, finally, I found the solution, When click the "Home" key, the app would be in onStop, but click "Back" key, the app would be in onDestroy, you can reference the Activity LifeCycle.

So, when the app call the onDestroy(), I kill any relation process with the app. The app work fine now. that's my code. in your FragmentActivity class

@Override
public void onDestroy() {
    super.onDestroy();
    Log.e(TAG, "--- ON DESTROY ---");
    killAppliactionProcess();
}

// Kill and relation process with the app
private void killAppliactionProcess() {
    Process.killProcess(Process.myPid());
}



回答3:


Try this:

private void setFragmentToTop(String tag) {
        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out);

        Fragment fragment = fm.findFragmentByTag(tag);
        if (fragment == null) {
            if (tag.equals(FragmentOne.TAG)) {
                fragment = FragmentOne.newInstance();
            }
            else if (tag.equals(FragmentTwo.TAG)) {
                fragment = FragmentTwo.newInstance();
            }
        }
        ft.replace(R.id.layoutContent, fragment, 
                tag);
        ft.commit();    

    }


来源:https://stackoverflow.com/questions/12057409/app-crashes-when-started-again-for-a-second-time

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!