Ist es möglich, dass eine Callback-Methode nach onDestroy aufgerufen wird?

In der neuesten Version meiner App ist bei einigen Benutzern ein Absturz aufgetreten, den ich nicht reproduzieren kann. Derzeit nurSamsung Geräte, auf denen @ ausgeführt wiLollipop haben das Problem, aber das könnte Zufall sein. Nachdem ich den Stack-Trace und den relevanten Code analysiert habe, glaube ich, dass ich den Schuldigen gefunden habe. Um meine Vermutung zu testen, habe ich den Code auf das folgende Snippet vereinfacht:

public class TestActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Button b = new Button(this);
        b.setText("Click me!");
        b.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new Handler().post(new Runnable() {
                    @Override
                    public void run() {
                        // This is the callback method
                        Log.d("TAG", "listenerNotified");
                    }
                });
            }
        });

        setContentView(b);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("TAG", "onDestroy");
    }

}

Jedes Mal teste ich die obige Anwendung, indem ich zuerst auf das @ tippKlick mic -Taste und dann die Zurück-Taste,listenerNotified wird auf die Konsole gedruckt, bevoronDestroy().

Ich bin mir aber nicht sicher, ob ich mich auf dieses Verhalten verlassen kann. HatAndroid irgendwelche Garantien über das obige Szenario machen? Kann ich davon ausgehen, dass meinRunnable wird immer vor @ ausgefühonDestroy() oder gibt es ein szenario, in dem das nicht der fall ist? In meiner realen App passiert natürlich viel mehr (wie bei anderen Threads, die im Haupt-Thread posten, und mehr Operationen, die im Rückruf stattfinden). Aber dieser einfache Ausschnitt schien ausreichend zu sein, um meine Besorgnis zu demonstrieren.

Ist es möglich (möglicherweise aufgrund des Einflusses anderer Threads oder Rückrufe, die an den Haupt-Thread gesendet wurden), dass ich die folgende Debug-Ausgabe erhalte?

D/TAG: onDestroy
D/TAG: listenerNotified

Ich würde das gerne wissen, da dieses Ergebnis den Absturz erklären würde.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage