当用户单击后退按钮时,我遇到了令人讨厌的崩溃。按下后退按钮时Android应用程序崩溃
在我的应用程序,我有3个相关的活动:
- MainActivity:显示人的名单
- PersonActivity:显示一个人的所有付款清单
- AddPaymentActivity:具有输入元素向个人添加付款
从MainActivity中,用户可以点击列表中的个人姓名以转到PersonActivity或使用Person's nam旁边的“+”按钮e并直接跳转到AddPaymentActivity。在PersonActivity中,还有一个“+”按钮,导致AddPaymentActivity。
Perons数据存储在实现Serializable接口的Java Person类中。当启动一个Activty我通过
intent.putExtra(MainActivity.PERSON_MESSAGE, person);
转发人物对象,当我从MainActivity去直接进入AddPaymentActivity(通过“+”),后退按钮正常工作。如果我然而使用从PersonActivity启动AddPaymentActivity,我的应用程序崩溃与空指针异常。
使用调试器,我注意到当按下后退按钮时,PersonActivity.onCreate()被调用(再次?)。为什么在返回形式AddPaymentActivity到PersonActivity时发生这种情况?为什么在从AddPaymentActivity返回MainActivity时不会发生这种情况?我能做些什么来解决这个问题?
堆栈跟踪:
01-13 10:11:01.423: E/AndroidRuntime(1022): FATAL EXCEPTION: main
01-13 10:11:01.423: E/AndroidRuntime(1022): Process: de.emteg.cashsplit, PID: 1022
01-13 10:11:01.423: E/AndroidRuntime(1022): java.lang.RuntimeException: Unable to start activity ComponentInfo{de.emteg.cashsplit/de.emteg.cashsplit.PersonActivity}: java.lang.NullPointerException
01-13 10:11:01.423: E/AndroidRuntime(1022): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2176)
01-13 10:11:01.423: E/AndroidRuntime(1022): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2226)
01-13 10:11:01.423: E/AndroidRuntime(1022): at android.app.ActivityThread.access$700(ActivityThread.java:135)
01-13 10:11:01.423: E/AndroidRuntime(1022): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397)
01-13 10:11:01.423: E/AndroidRuntime(1022): at android.os.Handler.dispatchMessage(Handler.java:102)
01-13 10:11:01.423: E/AndroidRuntime(1022): at android.os.Looper.loop(Looper.java:137)
01-13 10:11:01.423: E/AndroidRuntime(1022): at android.app.ActivityThread.main(ActivityThread.java:4998)
01-13 10:11:01.423: E/AndroidRuntime(1022): at java.lang.reflect.Method.invokeNative(Native Method)
01-13 10:11:01.423: E/AndroidRuntime(1022): at java.lang.reflect.Method.invoke(Method.java:515)
01-13 10:11:01.423: E/AndroidRuntime(1022): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
01-13 10:11:01.423: E/AndroidRuntime(1022): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
01-13 10:11:01.423: E/AndroidRuntime(1022): at dalvik.system.NativeStart.main(Native Method)
01-13 10:11:01.423: E/AndroidRuntime(1022): Caused by: java.lang.NullPointerException
01-13 10:11:01.423: E/AndroidRuntime(1022): at java.math.BigDecimal.<init>(BigDecimal.java:425)
01-13 10:11:01.423: E/AndroidRuntime(1022): at de.emteg.cashsplit.PersonActivity.onCreate(PersonActivity.java:37)
01-13 10:11:01.423: E/AndroidRuntime(1022): at android.app.Activity.performCreate(Activity.java:5243)
01-13 10:11:01.423: E/AndroidRuntime(1022): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
01-13 10:11:01.423: E/AndroidRuntime(1022): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2140)
01-13 10:11:01.423: E/AndroidRuntime(1022): ... 11 more
MainActivity.onCreate:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_overview);
persons = new ArrayList<Person>();
// Populate list with some test person objects
Person p = new Person("Frank");
p.getPayments().add(new Payment("test1", new BigDecimal(5.7)));
persons.add(p);
p = new Person("Peter");
persons.add(p);
ListView list = (ListView) findViewById(R.id.listView1);
PersonAdapter adapter = new PersonAdapter();
list.setAdapter(adapter);
// output....
}
PersonActivity.onCreate():
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_person);
Intent intent = getIntent();
this.person = (Person) intent.getSerializableExtra(MainActivity.PERSON_MESSAGE);
this.share = new BigDecimal(intent.getStringExtra(MainActivity.SHARE_MESSAGE));
this.totalSum = new BigDecimal(intent.getStringExtra(MainActivity.SUM_MESSAGE));
this.diff = person.getSum().subtract(share);
setupActionBar();
// output...
}
AddPaymentActivty.onCreate():
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_payment);
// Show the Up button in the action bar.
setupActionBar();
Intent intent = getIntent();
this.person = (Person) intent.getSerializableExtra(MainActivity.PERSON_MESSAGE);
if (intent.hasExtra(MainActivity.PAYMENT_MESSAGE)) {
this.payment = (Payment) intent.getSerializableExtra(MainActivity.PAYMENT_MESSAGE);
// output....
} else {
this.payment = null;
// output...
}
}
嗯,是的,如果你能后的堆栈跟踪,这将是巨大的。 – keyboardsurfer
看起来你的活动在你调用它时弹出堆栈,发布你创建的类的方法,你崩溃了。通过你的日志,似乎传递的东西实际上从来没有通过 – Saqib
在PersonActivity.onCreate()崩溃发生时这行的代码被执行: '意图意图= getIntent();'\t 'this.person =(人)intent.getSerializableExtra(MainActivity.PERSON_MESSAGE);' 但我认为,在按下返回按钮不会再次完全创建活动。它不会创建MainActivity。崩溃是合乎逻辑的,因为后退按钮没有放置额外功能。但为什么onCreate会发生呢? – Matthias