2014-01-13 263 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); 
相關問題