第二次再次启动时,应用程序崩溃启动时、应用程序

2023-09-06 15:44:22 作者:泪了

我目前移植一个iPhone应用程序到Android和我没有,我想我该怎么跟他们尝试碎片的线索,所以我创建几个类(一个用于psented用户每个视图这就是$ P $,上延伸基类片段)和相应的XML布局。 code以下为对发射显示的片段。我使用一个单独为每个片段。

 公共类FragWelcome扩展片段{私有静态FragWelcome _fs;OnClickListener mListener;公共FragWelcome(){}公共静态FragWelcome getFrag(){    如果(FragWelcome._fs == NULL)_fs =新FragWelcome();    返回_fs;}@覆盖公共无效的onCreate(捆绑savedInstanceState){    super.onCreate(savedInstanceState);}@覆盖公共无效onActivityCreated(捆绑savedInstanceState){    super.onActivityCreated(savedInstanceState);}@覆盖公共无效onAttach(活动活动){    super.onAttach(活动);    尝试{        mListener =(OnClickListener)活性;    }赶上(抛出ClassCastException E){        抛出新ClassCastException异常(activity.toString()+必须实现OnClickListener);    }}公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,捆绑savedInstanceState){  视图V = inflater.inflate(R.layout.frag_welcome,集装箱,FALSE);  ((按钮)v.findViewById(R.id.btnCreateNewList))setOnClickListener(mListener)。  ((按钮)v.findViewById(R.id.btnEditOldList))setOnClickListener(mListener)。  返回伏;}} 

然后我有我的碎片经理级与像这些方法:

 公共无效addFragment(INT容器,片f,诠释淡入,淡出INT,布尔addtobackstack,字符串变量){        this._currentFragment = F;        this._fragTrans = this._fragMan.beginTransaction();        this._fragTrans.setCustomAnimations(淡入,淡出);        this._fragTrans.add(集装箱,F标签);        如果(addtobackstack)this._fragTrans.addToBackStack(标签);        this._fragTrans.commit();}公共无效replaceFragment(INT容器,片f,诠释淡入,淡出INT,布尔addtobackstack,字符串变量){        this._currentFragment = F;        this._fragTrans = this._fragMan.beginTransaction();        this._fragTrans.setCustomAnimations(淡入,淡出);        this._fragTrans.replace(集装箱,F标签);        如果(addtobackstack)this._fragTrans.addToBackStack(标签);        this._fragTrans.commit();} 

这是我的主要活动课AC_Main的onCreate方法。

  @覆盖公共无效的onCreate(捆绑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\");} 
AE cc启动软件的时候一直崩溃

我能说什么....一切正常,只是优秀。没有错误可言......只要我不尝试启动APP第二次。

  08-21 16:27:18.278:D / AndroidRuntime(21576):关闭VM08-21 16:27:18.278:W / dalvikvm(21576):主题ID = 1:螺纹未捕获的异常(组= 0x40c351f8)退出08-21 16:27:18.283:E / AndroidRuntime(21576):致命异常:主要08-21 16:27:18.283:E / AndroidRuntime(21576):了java.lang.RuntimeException:无法启动活动ComponentInfo {de.lochmann.einkaufsliste / de.lochmann.einkaufsliste.AC_Main}:J- java.lang.IllegalStateException:活动已被破坏08-21 16:27:18.283:E / AndroidRuntime(21576):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1968)08-21 16:27:18.283:E / AndroidRuntime(21576):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1993)08-21 16:27:18.283:E / AndroidRuntime(21576):在android.app.ActivityThread.access $ 600(ActivityThread.java:127)08-21 16:27:18.283:E / AndroidRuntime(21576):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1159)08-21 16:27:18.283:E / AndroidRuntime(21576):在android.os.Handler.dispatchMessage(Handler.java:99)08-21 16:27:18.283:E / AndroidRuntime(21576):在android.os.Looper.loop(Looper.java:137)08-21 16:27:18.283:E / AndroidRuntime(21576):在android.app.ActivityThread.main(ActivityThread.java:4507)08-21 16:27:18.283:E / AndroidRuntime(21576):在java.lang.reflect.Method.invokeNative(本机方法)08-21 16:27:18.283:E / AndroidRuntime(21576):在java.lang.reflect.Method.invoke(Method.java:511)08-21 16:27:18.283:E / AndroidRuntime(21576):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:790)08-21 16:27:18.283:E / AndroidRuntime(21576):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)08-21 16:27:18.283:E / AndroidRuntime(21576):在dalvik.system.NativeStart.main(本机方法)08-21 16:27:18.283:E / AndroidRuntime(21576):java.lang.IllegalStateException:通过活动引起已被摧毁08-21 16:27:18.283:E / AndroidRuntime(21576):在android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1280)08-21 16:27:18.283:E / AndroidRuntime(21576):在android.app.BackStackRecord.commitInternal(BackStackRecord.java:541)08-21 16:27:18.283:E / AndroidRuntime(21576):在android.app.BackStackRecord.commit(BackStackRecord.java:525)08-21 16:27:18.283:E / AndroidRuntime(21576):在de.lochmann.einkaufsliste.FragMan.addFragment(FragMan.java:41)08-21 16:27:18.283:E / AndroidRuntime(21576):在de.lochmann.einkaufsliste.AC_Main.onCreate(AC_Main.java:124)08-21 16:27:18.283:E / AndroidRuntime(21576):在android.app.Activity.performCreate(Activity.java:4465)08-21 16:27:18.283:E / AndroidRuntime(21576):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1052)08-21 16:27:18.283:E / AndroidRuntime(21576):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1932)08-21 16:27:18.283:E / AndroidRuntime(21576):... 11个 

所以,再一次,当我开始从Eclipse的应用程序一切正常,该应用程序是完全稳定,直到我preSS Android设备(三星Galaxy S2)的home键,我回到我的应用程序。当我尝试启动应用程序再次将其与所述错误崩溃。任务经理说,它不是在后台运行了。所以我的问题是什么......我做错了,任何人都有自己的任何想法或经验?非常感谢。

我刚刚发现如果我在第二次应用程序崩溃和我的设备告诉我,它停止了应用程序,我可以在第三次尝试再次正常运行应用程序。也许它仍然是一个背景的碎片造成麻烦......!

编辑,新LogCat中输出,我实现每一个生命周期的方法后,我召集所有超级方法。

  08-21 17:17:09.043:I / dalvikvm(25725):打开JNI的​​应用程序错误的解决方法目标SDK版本10 ...08-21 17:17:09.108:I /活动(25725):所谓的onCreate08-21 17:17:09.108:I / FragWelcome(25725):onAttach叫08-21 17:17:09.108:I / FragWelcome(25725):所谓的onCreate08-21 17:17:09.123:D / dalvikvm(25725):GC_FOR_ALLOC释放86K,3%的自由8909K / 9091K,暂停13毫秒08-21 17:17:09.128:I / dalvikvm堆(25725):成长堆(frag的情况下),以11.061MB为2432016字节分配08-21 17:17:09.148:D / dalvikvm(25725):GC_CONCURRENT释放1K,免费3%11282K / 11527K,暂停1毫秒+ 1毫秒08-21 17:17:09.203:D / dalvikvm(25725):GC_FOR_ALLOC释放0K,3%的自由11283K / 11527K,暂停11毫秒08-21 17:17:09.208:I / dalvikvm堆(25725):成长堆(frag的情况下),以16.278MB为5472016字节分配08-21 17:17:09.228:D / dalvikvm(25725):GC_CONCURRENT释放0K,免费2%16626K / 16903K,暂停1毫秒+ 2ms的08-21 17:17:09.318:I / FragWelcome(25725):onCreateView叫08-21 17:17:09.318:I / FragWelcome(25725):onActivityCreated叫08-21 17:17:09.323:I /活动(25725):在onStart叫08-21 17:17:09.323:I / FragWelcome(25725):在onStart叫08-21 17:17:09.323:I /活动(25725):onResume叫08-21 17:17:09.323:I / FragWelcome(25725):onResume叫08-21 17:17:09.503:D /剪贴板(25725):隐藏剪贴板在对话框输入出发:由别人完成了...!08-21 17:17:21.258:I / FragWelcome(25725):所谓的onPause08-21 17:17:21.258:I /活动(25725):所谓的onPause08-21 17:17:21.438:D /剪贴板(25725):隐藏剪贴板在对话框输入出发:由别人完成了...!08-21 17:17:21.908:I / FragWelcome(25725):所谓的onStop08-21 17:17:21.908:I /活动(25725):所谓的onStop08-21 17:17:21.908:I / FragWelcome(25725):onDestroyView叫08-21 17:17:21.908:I / FragWelcome(25725):所谓的onDestroy08-21 17:17:21.913:I / FragWelcome(25725):onDetach叫08-21 17:17:21.913:I /活动(25725):所谓的onDestroy08-21 17:17:32.833:I /活动(25725):所谓的onCreate08-21 17:17:32.833:D / AndroidRuntime(25725):关闭VM08-21 17:17:32.833:W / dalvikvm(25725):主题ID = 1:螺纹未捕获的异常(组= 0x40c351f8)退出08-21 17:17:32.838:E / AndroidRuntime(25725):致命异常:主要08-21 17:17:32.838:E / AndroidRuntime(25725):了java.lang.RuntimeException:无法启动活动ComponentInfo {de.lochmann.einkaufsliste / de.lochmann.einkaufsliste.AC_Main}:java.lang.IllegalStateException:活动已被破坏08-21 17:17:32.838:E / AndroidRuntime(25725):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1968)08-21 17:17:32.838:E / AndroidRuntime(25725):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1993)08-21 17:17:32.838:E / AndroidRuntime(25725):在android.app.ActivityThread.access $ 600(ActivityThread.java:127) 

我从以前的logcat读的是一些问题与backstackrecord.commit ...有人知道这事?

  08-21 16:27:18.283:E / AndroidRuntime(21576):java.lang.IllegalStateException:通过活动引起已被摧毁08-21 16:27:18.283:E / AndroidRuntime(21576):在android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1280)08-21 16:27:18.283:E / AndroidRuntime(21576):在android.app.BackStackRecord.commitInternal(BackStackRecord.java:541)08-21 16:27:18.283:E / AndroidRuntime(21576):在android.app.BackStackRecord.commit(BackStackRecord.java:525)08-21 16:27:18.283:E / AndroidRuntime(21576):在de.lochmann.einkaufsliste.FragMan.addFragment(FragMan.java:41)08-21 16:27:18.283:E / AndroidRuntime(21576):在de.lochmann.einkaufsliste.AC_Main.onCreate(AC_Main.java:124) 

解决方案

试试这个:

 私人无效setFragmentToTop(字符串标签){        FragmentManager FM = getSupportFragmentManager();        FragmentTransaction英尺= fm.beginTransaction();        ft.setCustomAnimations(android.R.anim.fade_in,android.R.anim.fade_out);        片段片段= fm.findFragmentByTag(标签);        如果(片段== NULL){            如果(tag.equals(FragmentOne.TAG)){                片段= FragmentOne.newInstance();            }            否则如果(tag.equals(FragmentTwo.TAG)){                片段= FragmentTwo.newInstance();            }        }        ft.replace(R.id.layoutContent,片段                标签);        ft.commit();    } 

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)

解决方案

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();    

    }