2014-01-13 50 views
0

当用户单击后退按钮时,我遇到了令人讨厌的崩溃。按下后退按钮时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... 
    } 

} 
+3

嗯,是的,如果你能后的堆栈跟踪,这将是巨大的。 – keyboardsurfer

+0

看起来你的活动在你调用它时弹出堆栈,发布你创建的类的方法,你崩溃了。通过你的日志,似乎传递的东西实际上从来没有通过 – Saqib

+0

在PersonActivity.onCreate()崩溃发生时这行的代码被执行: '意图意图= getIntent();'\t 'this.person =(人)intent.getSerializableExtra(MainActivity.PERSON_MESSAGE);' 但我认为,在按下返回按钮不会再次完全创建活动。它不会创建MainActivity。崩溃是合乎逻辑的,因为后退按钮没有放置额外功能。但为什么onCreate会发生呢? – Matthias

回答

0

它必须是因为空指针异常导致您的应用程序崩溃。

首先,检查您的PersonActivity中是否需要一个值,当您从AddPaymentActivity中按下后退按钮时,该值不会传递/设置。

您也可以重写onResume()函数,它将在按下后退按钮时调用。

+0

我通过intent.putExtra()传递必要的对象。如何在按下后退按钮时执行此操作? – Matthias

+0

您可以在自己AddPaymentActivity覆盖onBackPressed功能: '@覆盖 公共无效onBackPressed(){ super.onBackPressed(); //可选 //你可以把你的意图放在这里,putExtra,startActivity } – user3091819

1

您的问题是在那些2线之一:

this.share = new BigDecimal(intent.getStringExtra(OverviewActivity.SHARE_MESSAGE)); 
this.totalSum = new BigDecimal(intent.getStringExtra(OverviewActivity.SUM_MESSAGE)); 

看来你的2 getStringExtra返回NULL之一。

0

检查您还没有添加完成();在您的意图之后。您希望从之前活动返回的意图/活动,将此意向添加到父活动时,请确保调用此意向的父活动不具有finish();.例如:

主要活动呼吁付款活动:

Intent d = new Intent(getApplicationContext(), 
       PaymentActivity.class); 
     startActivity(d); 
     finish();***//remove this*** 
     return true; 

如果你告诉活性调用另一个活动结束(),这基本上意味着,活性称为可neevr返回到先前的活动,因此这下面是正确的: //结束();已被删除

Intent d = new Intent(getApplicationContext(), 
       PaymentActivity.class); 
     startActivity(d); 
     return true; 

你需要做的下一件事就是MAK确保您的清单已将父级活动添加到活动中。

如:

<activity 
     android:name=".PaymentActivity" 
     android:label="@string/paymentlabel" 
     android:parentActivityName=".PaymentActivity" /> 

并在您的付款活动的onCreate添加以下内容:

assert getSupportActionBar() != null;***> //this tells the application that ActionBar is not null and therefore dont call an java null exceptions and crash the activity 

getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    getSupportActionBar().setDisplayShowHomeEnabled(true); 
相关问题