2010-07-07 6 views
3

J'ai le problème suivant. Mon activité principale consiste en un ListView rempli avec les données obtenues à partir d'un service Web. Lorsque l'activité principale est chargée en premier, au cas où les données ne peuvent pas être récupérées sur le web, je veux afficher une boîte de dialogue avec 2 boutons, "Réessayer" et "Annuler". Si l'utilisateur clique sur "Répondre", la méthode de rechargement des données est appelée, et s'il y a une exception, la boîte de dialogue devrait apparaître à nouveau.Android Réessayer/Annuler la boîte de dialogue

Je n'ai pas encore trouvé le moyen d'implémenter mon comportement désiré.

@Override 
protected void onResume() { 
    super.onResume(); 
    Log.i("ItemListActivity", "onResume()"); 
    if(isNewInstance) { 
     reloadItems(); 
     isNewInstance = false; 
    } 
} 

private void reloadItems() { 

    try { 
     itemService.reloadItems(); 
     items = itemService.getItemList(); 
     listAdapter.notifyDataSetChanged(); 
    } catch (Exception e) { 
     showDialog(RETRY_DIALOG);     
    } 

} 

protected Dialog onCreateDialog(int id) { 
    switch(id) { 
     case RETRY_DIALOG: 
     return new AlertDialog.Builder(this).setTitle(R.string.retryDialog_title) 
     .setPositiveButton(R.string.retryDialog_retry, new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        reloadItems(); 
       } 


      }) 
      .setNegativeButton(R.string.retryDialog_quit, new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        finish(); 
       } 
      }) 
      .create(); 
    } 

    return null; 
} 

La première fois est appelé à partir onResume() et une exception est rencontré les reloadItems(), la boîte de dialogue est affichée. Mais quand je clique sur le bouton "Réessayer" et cette fois reloadItems() est appelé à partir du onclicklistener de la boîte de dialogue, la boîte de dialogue n'est pas affichée la deuxième fois, je devine parce que l'onclicklistener retournera seulement après que le reloadItems() est retourné la deuxième fois .

J'ai essayé d'exécuter reloadItems() dans un nouveau thread à partir de onClick(), mais le code s'exécute toujours dans le thread principal. Si j'exécute reloadItems() de onResume() dans un nouveau thread, le code s'exécute dans un nouveau thread. Ce que j'ai également remarqué lors du débogage est que la boîte de dialogue n'est pas affichée juste après le retour de showDialog (RETRY_DIALOG), seulement après le retour de reloadItems().

Comme ce que je veux faire est un comportement assez commun, je suis sûr qu'il existe une solution «meilleure pratique» à cela. Je suis totalement nouveau sur Android et je ne suis pas habitué à ce style.

Répondre

5

Vous devez exécuter votre méthode reloadItems dans un ASyncTask.

Ils exécutent votre processus d'accès et de téléchargement Web dans un fil d'arrière-plan et vous permettent d'afficher des mises à jour de l'interface utilisateur sur le fil de l'interface utilisateur.

Vous pouvez également gérer l'exception dans le thread d'arrière-plan, puis publier une mise à jour dans le thread d'interface utilisateur qui affiche votre boîte de dialogue. Ne pas oublier de tuer votre tâche après cette mise à jour d'échec ou il continuera à essayer de courir et penser qu'il a fini avec succès.

aussi important, vous devez créer une instance de votre nouvelle tâche à chaque fois qu'il fonctionne (si l'auditeur onClick du bouton Retry par exemple. Réutiliser une tâche fera une exception.

Questions connexes