Android app stürzt ab, wenn der zurück-button ist gedrückt
Habe ich in einem ärgerlichen Absturz in meiner app, wenn der Benutzer auf die zurück-Taste.
In meine app, ich habe 3 relevante Tätigkeiten:
- MainActivity: zeigt eine Liste von Personen, die
- PersonActivity: zeigt eine Liste aller Zahlungen, die von einer Person
- AddPaymentActivity: hat input-Elemente hinzufügen, um eine Zahlung an eine Person
Aus der MainActivity kann der Benutzer entweder Tippen Sie auf den Namen einer Person in der Liste zu gehen, um PersonActivity oder verwenden Sie einen " + " - Schaltfläche neben dem Namen der Person und springen direkt in AddPaymentActivity. In PersonActivity ist ein " + " - button, der führt zu AddPaymentActivity auch.
Die Personen-Daten in eine Java-Klasse "Person" implementiert das Serializable interface. Beim Start einer Activty ich vorn das Person-Objekt über
intent.putExtra(MainActivity.PERSON_MESSAGE, person);
Wenn ich von der MainActivity direkt in AddPaymentActivity (über "+"), die zurück-Taste funktioniert einwandfrei. Wenn ich jedoch über start AddPaymentActivity von PersonActivity, meine Anwendung stürzt mit einem null-Zeiger-Ausnahme.
Mit dem debugger habe ich gemerkt, dass PersonActivity.onCreate() aufgerufen wird (wieder?) wenn Sie die zurück-Taste gedrückt wird. Warum passiert das beim gehen zurück form AddPaymentActivity zu PersonActivity? Und warum ist das NICHT geschehen, wenn Sie zurück AddPaymentActivity auf MainActivity? Was kann ich tun, um das problem zu beheben?
Stack trace:
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...
}
}
- Hmm ja, Wenn Sie könnte den stacktrace, das wäre toll.
- scheint Ihre Aktivität ist herausgesprungen stack, wenn Sie nennen Sie es, posten Sie Ihre auf create-Methode der Klasse, die Sie bekommen, Absturz in. Durch dein log scheint es etwas überholt ist tatsächlich nie bestanden
- Der Absturz in PersonActivity.onCreate() passiert, wenn diese Codezeile ausgeführt wird:
Intent intent = getIntent();
this.person = (Person) intent.getSerializableExtra(MainActivity.PERSON_MESSAGE);
Aber ich würde denken, dass das drücken der zurück-Taste nicht vollständig erstellt die Aktivität wieder. Es nicht schaffen die MainActivity. Der crash ist logisch, weil die zurück-Taste nicht für die extras. Aber warum macht onCreate überhaupt passieren? - Sie besseren code für Ihre drei onCreates (), sonst wäre es nur eine Vermutung, um zu versuchen, was stimmt hier nicht!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dein problem ist in einer von diesen 2 Zeilen :
Es scheint, dass einer Ihrer 2
getStringExtra
null zurück.Muss es sein, aufgrund einer null-Zeiger-Ausnahme, die bewirkt, dass Ihre app zum Absturz.
Prüfen Sie zunächst, ob in Ihrem PersonActivity muss ein Wert, der nicht übergeben/gesetzt, wenn die zurück-Taste gedrückt wird von Ihrem AddPaymentActivity.
Können Sie auch überschreiben, der onResume () - Funktion wird aufgerufen, wenn der back-button gedrückt wird.
@Override public void onBackPressed() { super.onBackPressed(); // optional //you may put your intent here, putExtra, startActivity }
Überprüfen Sie, dass Sie nicht Hinzugefügt haben, beenden(); nach Ihrer Absicht.Die Vorsatz - /Aktivitäts-Sie wollen die Rückkehr zu der vorherigen Aktivität,wenn das hinzufügen dieser Absicht der übergeordneten Aktivität,stellen Sie sicher, dass die übergeordnete Aktivität aufrufen dieser Absicht nicht beenden();.zum Beispiel:
Haupttätigkeit aufrufen Bezahlung Tätigkeit:
wenn Sie sagen, dass die Aktivität ruft eine andere Aktivität zu beenden(),dies bedeutet im Grunde, dass die Tätigkeit als kann neevr zurück zur vorherigen Aktivität, also das unten ist richtig:
//beenden();entfernt wurde
Das nächste, was Sie tun müssen ist, stellen Sie sicher, dass Ihr manifest hat die übergeordnete Aktivität Hinzugefügt, um die Aktivitäten.
ZB:
Und in Ihrer Zahlung Activity onCreate hinzufügen,die folgenden: