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!
InformationsquelleAutor Matthias | 2014-01-13
Schreibe einen Kommentar