Quando la mia applicazione Android un'eccezione, voglio mostrare una finestra personalizzata di dire all'utente che c'è qualcosa di sbagliato è successo, per cui uso Thread.setDefaultUncaughtExceptionHandler
per impostare un gestore di eccezioni globale:Mostra una finestra di dialogo in `Thread.setDefaultUncaughtExceptionHandler`
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, final Throwable ex) {
AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());
builder.setTitle("There is something wrong")
.setMessage("Application will exit:" + ex.toString())
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// throw it again
throw (RuntimeException) ex;
}
})
.show();
}
});
}
}
Ma ho scoperto che c'è qualche eccezione generata, la AlertDialog
non mostrerà, invece, i blocchi applicativi e dopo un po ', si mostreranno una finestra di dialogo di sistema:
X app is not responding. Would you like to close it?
Wait | OK
Cosa devo fare ora ?
UPDATE
Il registro:
11-16 12:54:16.017: WARN/WindowManager(90): Attempted to add window with non-application token WindowToken{b38bb6a8 token=null}. Aborting.
Sembra l'errore viene da new AlertDialog.Builder(getApplicationContext());
Ma questo è un gestore di eccezioni in Application
sottoclasse, come posso impostare un'istanza di attività ad esso?
incollare il logcat troppo – waqaslam
appare Quel messaggio quando l'appli richiede troppo tempo (non c'è eccezione in questo caso). La mia raccomandazione è di provare a spostare le tue attività pesanti su un AsyncTask. – richardtz