2010-07-31 6 views
0

J'ai une activité qui charge un AlertDialog comme ceci.Gestion des changements d'orientation avec Context et AlertDialog/AsyncTask

 progressDialog = new ProgressDialog(MyActivity.this); 
     progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
     progressDialog.setMessage("Doing Something"); 
     progressDialog.setCancelable(false); 
     progressDialog.show(); 

J'ai aussi une autre classe qui étend AsyncTask

private class MyBackgroundTask extends AsyncTask<Void, Void, Boolean> { 

     @Override 
     protected Boolean doInBackground(Void... params) { 

      ...do stuff 
     } 

     @Override 
     protected void onPostExecute(Boolean result) { 

      progressDialog.dismiss(); 
     } 

     @Override 
     protected void onProgressUpdate(Void... values) { 

     } 

    } 

Si l'orientation des changements d'écran que je reçois une erreur d'essayer de joindre à une vue qui n'existe pas. C'est parce que l'activité a été détruite et le contexte a disparu.

J'ai donc ajouté ceci à onDestroy() et il l'a corrigé.

@Override 
    public void onDestroy() { 

     if(progressDialog!=null) 
      if(progressDialog.isShowing()) 
       progressDialog.cancel(); 

     if(background!=null) 
      background.cancel(true); 
    } 

Mais cela signifie que je dois toujours garder une référence à la boîte de dialogue et AsyncTask

Je ne peux pas faire ceci par exemple:

new MyAsyncTask().execute(); 

En cas de changement d'orientation, aussi je ne peut pas faire cela:

new AlertDialog.Builder(this) 
    .setIcon(android.R.drawable.ic_dialog_alert) 
    .setTitle("some title") 
    .setMessage("some message") 
    .setPositiveButton(R.string.ok, null) 
    .show(); 

Cela ne me semble pas juste et il doit y avoir une meilleure wa y, je sais que vous pouvez utiliser getApplicationContext() mais dans certaines situations ce n'est pas viable.

Comment gérer cela correctement?

Répondre

0

i ont à peu près la même question, je pense que la façon de gérer ce n'est pas si simple, vous avez deux options:

  1. font l'activité gérer le changement de configuration lui-même de sorte que vous ont l'habitude de la activité tuée, mais alors vous devrez appeler la boîte de dialogue invalider ou requestLayout je pense.
  2. Faites votre propre boîte de dialogue de progression (hérité de AlertDialog ou des classes de dialogue, et ont une méthode interne qui sauve son état actuel et l'utiliser si le dialogue est dans saveInstanceState. Et restaurer en cas de besoin.

Votre Si vous démarrez une tâche asynchrone dans une activité qui meurt, je n'ai aucune idée de ce qu'elle mesure pour la tâche, essentiellement pour l'éviter, vous avez besoin d'un thread qui démarre dans Application onCreate et meurt dans c'est onDestroy qui fait ces choses pour vous, c'est indépendant de l'activité ou vous devez utiliser un service avec des diffusions sticky donc même si votre activité n'écoute pas la diffusion en raison du changement d'orientation, elle sera diffusée une fois que c'est bac k et écoute. De cette façon, vous n'êtes pas tenu de détenir une instance de votre activité qui sera annulée ou dans un état invalide pour votre service à gérer.