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
Libérer: 2024-12-05 15:22:10
original
921 Les gens l'ont consulté

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);
}
Copier après la connexion

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);
Copier après la connexion

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal