第二次再次启动时,应用程序崩溃 [英] App crashes when started again for a second time
问题描述
我目前移植一个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\");}
我能说什么....一切正常,只是优秀。没有错误可言......只要我不尝试启动APP第二次。
08-21 16:27:18.278:D / AndroidRuntime(21576):关闭VM
08-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):所谓的onCreate
08-21 17:17:09.108:I / FragWelcome(25725):onAttach叫
08-21 17:17:09.108:I / FragWelcome(25725):所谓的onCreate
08-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):所谓的onPause
08-21 17:17:21.258:I /活动(25725):所谓的onPause
08-21 17:17:21.438:D /剪贴板(25725):隐藏剪贴板在对话框输入出发:由别人完成了...!
08-21 17:17:21.908:I / FragWelcome(25725):所谓的onStop
08-21 17:17:21.908:I /活动(25725):所谓的onStop
08-21 17:17:21.908:I / FragWelcome(25725):onDestroyView叫
08-21 17:17:21.908:I / FragWelcome(25725):所谓的onDestroy
08-21 17:17:21.913:I / FragWelcome(25725):onDetach叫
08-21 17:17:21.913:I /活动(25725):所谓的onDestroy
08-21 17:17:32.833:I /活动(25725):所谓的onCreate
08-21 17:17:32.833:D / AndroidRuntime(25725):关闭VM
08-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();
}
这篇关于第二次再次启动时,应用程序崩溃的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!