2010-09-02 29 views
0

J'ai une application qui doit créer une base de données et si cela échoue, alors pas de sens aller de l'avant. J'ai construit un AlertDialog et show(), mais il ne s'affiche jamais. La logique passe à travers, puis barfs à cause de la base de données manquante.Quel est le meilleur moyen d'arrêter une activité et d'alerter l'utilisateur?

Quelle est la bonne/meilleure façon de lancer un message et d'interrompre l'activité? Le code ci-dessous s'exécute bien (ce qui signifie que le show() se produit pendant le débogage et qu'il tombe à la ligne suivante), mais l'interface utilisateur n'affiche jamais cette alerte. BTW - Je me rends compte que le lancer n'est peut-être pas le plus gracieux mais je n'obtiens même pas si loin ... B ^).

try { 

    myDBHelp.createDataBase(); 
} catch (IOException ioe) { 
    new AlertDialog.Builder(this).setCancelable(false) 
     .setMessage(ioe.getMessage()) 
     .setTitle("Database Create Failed") 
     .setPositiveButton("Quit", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       throw new Error("Unable to create database - please try uninstall/reinstall"); 
      } 
     }) 
     .show(); 

Répondre

0

je ususally quelque chose comme ceci:

void myFunction() { 

    try { 
     somecode.. 
    } catch (IOException e){ 
     e.printStackTrace(); 
     doToast("Unknown Error"); //Display Toast to user 
     return;   //Leave myFunction 
    } 

    somecode... //If no error continue here 

    return; 
} 

protected void doToast(final String str) { 
    this.runOnUiThread(new Runnable() { 
     public void run() { 
      Toast.makeText(myClass.this, str, Toast.LENGTH_SHORT).show(); 
     } 
    }); 

} 
+0

L'utilisation d'un toast est certainement valable mais je me demande si j'aurais eu le même problème. Le problème est que l'interface utilisateur ne montrait pas mon dialogue avant qu'il ait vomi. Il s'avère que le paramètre override onResume() s'exécutait AVANT que la boîte de dialogue ne s'affiche et échouait, car le code attendait une base de données. J'ai dû mettre dans un booléen et tester/exécuter seulement ce code dépendant si aucune erreur antérieure. Une fois onResume() terminé, la boîte de dialogue s'affiche. Je suis sûr que Toast fonctionnera une fois que j'ai protégé le code onResume(). Merci. – teachableMe

0

Je ne sais pas ce flux u use.But ont une suggestion U peut le faire comme ça.

U peut commencer l'opération de base de données comme celui-ci ..

intention i = new Intent (ce, Databaseoperation.class); startactivity (i); ............................... cela fera des contrôles pour passer à la classe d'opération de la base de données il effectue diverses opérations comme ouvert. fermez, insérez delete..etc.

U peut étendre databasehelper intégré la classe

et maintenant, quand aucun problème dans la base de données d'ouverture ou de toute substance, l'intention finition () et revenir à l'activité principale ...

U peut faire comme ce ..

grâce Rakesh

+0

C'est laisser l'utilisateur savoir que quelque chose s'est mal passé et empêcher le code inutile de se produire et de sauter. Je me demande si l'utilisation d'Intent ne ferait qu'aggraver le problème - lancer un thread de base de données asynchrone alors qu'en fait je veux bloquer/attendre que cela se termine - pas de base de données, pas d'application. – teachableMe

0

Est-ce que createDataBase() lance l'erreur ou la gère elle-même? S'il gère l'exception elle-même, alors elle n'atteint jamais votre bloc externe et par conséquent vous ne traversez jamais le bloc catch. Assurez-vous d'avoir throws IOException ajouté à la fin de la signature de la méthode comme ceci:

public void createDataBase() throws IOException {[...]} 

Aussi, s'il vous plaît assurez-vous de ne pas avoir des blocs try/catch capture IOException intérieur de createDataBase(). Ainsi, à chaque fois qu'un IOException se produit, il est délégué à votre bloc catch externe et votre boîte de dialogue apparaît. Rakesh- le problème n'est pas d'attraper l'erreur.

+0

oh putain pourquoi était-ce sous de nouvelles questions ... J'ai seulement remarqué maintenant que ce poste est près de 7 ans ...... – Aenadon