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 ?
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!