Maison >Java >javaDidacticiel >Pourquoi mon application Android plante-t-elle avec « Tentative d'invocation d'une méthode virtuelle… sur une référence d'objet nulle » lors de la transition des activités ?

Pourquoi mon application Android plante-t-elle avec « Tentative d'invocation d'une méthode virtuelle… sur une référence d'objet nulle » lors de la transition des activités ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-05 15:22:10885parcourir

Why Does My Android App Crash with

Tentative d'invocation d'une méthode virtuelle : référence d'objet nul

Problème :

Lors de la transition de SplashActivity à LoginActivity dans une application Android, un crash se produit avec l'erreur : "Tentative d'appel de la méthode virtuelle 'android.view.Window$Callback android.view.Window.getCallback()' sur une référence d'objet nulle."

Explication :

L'exception se produit car LoginActivity tente d'accéder aux vues (par exemple, EditText, TextView) avant que l'activité ne soit complètement initialisée et prête. findViewById() est appelé dans le constructeur de LoginActivity, mais setContentView(...) n'est pas explicitement appelé dans onCreate().

Résolution :

Pour résoudre le problème, initialiser les champs de vue dans onCreate() après setContentView(...):

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);

    usernameField = (EditText) findViewById(R.id.username);
    passwordField = (EditText) findViewById(R.id.password);
    error = (TextView) findViewById(R.id.error);
    progress = (ProgressBar) findViewById(R.id.progress);
}

Suggestion d'optimisation :

Envisagez d'utiliser un gestionnaire au lieu d'un minuteur pour planifier la transition d'intention. Un Timer exécute la TimerTask sur un thread d'arrière-plan, ce qui doit être évité dans ce cas. Le gestionnaire veillera à ce que la tâche soit exécutée sur le thread de l'interface utilisateur.

new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        Intent intent = new Intent(SplashActivity.this, LoginActivity.class);
        startActivity(intent);
        finish();
    }
}, 1500);

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn