2011-01-05 9 views
1

Hier ist mein Code: ("apagar" bedeutet "Turn off", "reiniciar" bedeutet "Neustart")Warum meine Anwendung hängen bleibt, wenn ich eine Warnung in meiner eigenen "uncoughtException()" -Methode zeige?

public void uncaughtException(Thread thread, Throwable ex) 
{ 
    try 
    { 
     AlertDialog alertDialog; 
     alertDialog = new AlertDialog.Builder(iAct).create(); 
     //alertDialog.setTitle(""); 
     alertDialog.setMessage("Se ah producído un error y la aplicación no puede continuar funcionando." + 
           "¿Desea reiniciarla o finalizarla?"); 
     alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "Reiniciar", new ReiniciarOnClickListener(iAct)); 
     alertDialog.setButton(AlertDialog.BUTTON_NEGATIVE,"Apagar", new ApagarOnClickListener(iAct)); 
     alertDialog.show(); 
    }catch(Exception e){ 
     Thread.setDefaultUncaughtExceptionHandler(iDefaultHandler); 
     iDefaultHandler.uncaughtException(thread, ex); 
    } 
} 

der gesamte Code innerhalb Try Block ausgeführt wird, aber der Alarm wird niemals angezeigt, und die Bildschirm bleibt grau.

In iDefaultHandler habe ich das Ergebnis von getDefaultUncoughtException() gespeichert, bevor ich meins.

Alle Informationen, die fehlen, bitte fragen Sie danach. Ich weiß nicht, wie ich das lösen soll.

+0

Wird dies im UI-Thread oder in einem Hintergrund-Thread ausgeführt? –

+0

Ich erstelle nie einen zusätzlichen Thread, also denke ich, dass es im UI-Thread ist. –

+0

Ja, im Debug-Fenster, wenn es in einem Breakpoint in diesem Code stoppt, ist der suspendierte Thread derjenige, der "main" sagt. –

Antwort

0

Versuchen Sie, .create() aus. Starten Sie den AlertDialog und zeigen Sie ihn an.

+0

Sie meinen "out" des Try-Blocks? Ich habe bereits versucht, ohne den Try/Catch-Block und es verhält sich auf die gleiche Weise –

+0

Nein, ich meine, entfernen Sie es vollständig. Ich habe meine AD ohne .create() eingerichtet und es funktioniert gut. – AedonEtLIRA

+0

Ahh, ich habe es. Nun, ich merkte, dass es nicht mit der Warnung verbunden ist. Jetzt arbeite ich an einer Idee, die dave.c mir sagte. –

0

Haben Sie versucht, mit onCreateDialog den Dialog zu erstellen? Etwas wie:

private static final int DIALOG_UNCAUGHT_EXCEPTION = 0; 

... 

public void uncaughtException(Thread thread, Throwable ex) 
{ 
    try 
    { 
     showDialog(DIALOG_UNCAUGHT_EXCEPTION); 
    }catch(Exception e) 
    { 
     Thread.setDefaultUncaughtExceptionHandler(iDefaultHandler); 
     iDefaultHandler.uncaughtException(thread, ex); 
    } 
} 

@Override 
protected Dialog onCreateDialog(int id) { 
    Dialog dialog; 
    switch (id) { 
    case DIALOG_UNCAUGHT_EXCEPTION: 
     AlertDialog.Builder alertDialog = new AlertDialog.Builder(this); 
     alertDialog.setMessage("message") 
      .setPositiveButton("Reiniciar",new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        // do stuff; 
       } 
      }) 
      .setNegativeButton("Apagar",new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        // do other stuff; 
       } 
      }); 
     alertDialog.create(); 
     break; 
    default: 
     dialog = null; 
     break; 
    } 
    return dialog; 
} 

Offensichtlich können Sie die Standard-Tastenhörer mit Ihren eigenen ersetzen, wenn Sie müssen.

+0

habe ich diesen Code auf meine Tätigkeit und jetzt sieht mein uncoughtException() -Methode auf diese Weise: –

+0

public void uncaughtException (Thread Thread, Throwable ex) \t { \t \t iAct.showDialog (iAct.DIALOG_UNCAUGHT_EXCEPTION); \t} Aber noch, wenn ich eine Ausnahme auslösen, friert die Aktivität ein. –

+0

Es gibt ein paar Dinge zu versuchen: 1) Ersetzen Sie den 'showDialog (DIALOG_UNCAUGHT_EXCEPTION);' Aufruf mit 'Log.d (" uncaughtException "," Dialog geht hier ");' - hängt es noch? 2) Umbrechen Sie Ihren Aufruf an 'setDefaultUncaughtExceptionHandler' in einem' try/catch'-Block, der die ausgelöste Ausnahme protokolliert. Ändert es das Verhalten? 3) Schritt durch den Code im Debugger, oder alternativ fügen Sie viele 'Log.d (" TAG "," Nachricht ");' Ausgabe, um Ihre Anwendung Verhalten zu überprüfen. –

Verwandte Themen