2013-05-15 17 views
64

Se la mia app si blocca, si blocca per un paio di secondi prima che mi venga comunicato da Android che l'app si è bloccata e deve essere chiusa. Stavo pensando di catturare tutte le eccezioni nella mia app con un generale:Le best practice per la gestione delle eccezioni di Android?

try { 
    // ... 
} catch(Exception e) { 
    // ... 
} 

e fare una nuova Activity che spiega che l'applicazione si è schiantato subito (e anche di dare agli utenti la possibilità di inviare una mail con i dettagli di errore) , invece di avere quel ritardo grazie ad Android. Ci sono metodi migliori per farlo o è scoraggiato?

Aggiornamento: Sto utilizzando un Nexus 5 con ART abilitato e non noto il ritardo che ho provato con le app in crash (il "sospeso" di cui stavo parlando in origine). Penso che dal momento che tutto è codice nativo ora, l'arresto si verifica immediatamente insieme a ottenere tutte le informazioni sugli arresti anomali. Forse il Nexus 5 è solo veloce :) a prescindere, questo potrebbe non essere un problema nelle versioni future di Android (dato che ART sarà il runtime predefinito in Android L).

+1

si prega di [controllare link] (https://developers.google.com/analytics/devguides/collection/android/v2/exceptions) – CRUSADER

+0

quando incidente accade la tua attività è distrutta quindi non c'è modo di gestire l'incidente tu stesso. – Raghunandan

+0

@Raghunandan sì ma se l'arresto anomalo si verifica a causa di un'eccezione non gestita, è possibile utilizzare un generale catch per tutto il gestore di eccezioni e impedirne il blocco completo. – Logan

risposta

84

Qui controllare lo link for reference.

Qui si crea una classe dicono ExceptionHandler che implements java.lang.Thread.UncaughtExceptionHandler ..

All'interno di questa classe si farà la vostra vita di risparmio cose come la creazione di stacktrace e gettin pronto a caricare rapporto di errore, ecc ....

Ora arriva la parte importante ie Come rilevare tale eccezione. Anche se è molto semplice. Copia la seguente riga di codice in ogni attività appena dopo la chiamata del super metodo nel tuo metodo sovrascritto onCreate.

Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler(this)); 

tua attività può sembrare qualcosa di simile ...

public class ForceClose extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler(this)); 

     setContentView(R.layout.main); 
    } 
} 

Spero che questo aiuti ...

+0

L'attività di esempio non implementa 'UncaughtExceptionHandler' :) Grazie per la risposta, proverò quando torno a casa dal lavoro. – Logan

+0

Inoltre, 'Thread.setDefaultUncaughtExceptionHandler()' non deve essere inserito nella tua principale/prima attività in modo che gestisca tutte le eccezioni all'interno dell'applicazione? – Logan

+0

Ho detto, per creare una classe, dire che ExceptionHandler implementa java.lang.Thread.UncaughtExceptionHandler .... E poi nelle normali attività aggiungere la linea di codice sopra menzionata ... Si prega di fare riferimento al collegamento menzionato sopra per avere un'idea più ampia .. – CRUSADER

9

Si potrebbe utilizzare una finestra di allarme generico per visualizzare rapidamente i messaggi di errore. Per esempio ...

//****************************************** 
//some generic method 
//****************************************** 
private void doStuff() 
{  
    try 
    { 
     //do some stuff here 
    } 
    catch(Exception e) 
    { 
     messageBox("doStuff", e.getMessage()); 
    } 
} 


//********************************************************* 
//generic dialog, takes in the method name and error message 
//********************************************************* 
private void messageBox(String method, String message) 
{ 
    Log.d("EXCEPTION: " + method, message); 

    AlertDialog.Builder messageBox = new AlertDialog.Builder(this); 
    messageBox.setTitle(method); 
    messageBox.setMessage(message); 
    messageBox.setCancelable(false); 
    messageBox.setNeutralButton("OK", null); 
    messageBox.show(); 
} 

Si potrebbe anche aggiungere altre opzioni di gestione degli errori in questo metodo, come stacktrace stampa

+0

probabilmente dovresti elaborare il messaggio di errore prima di mostrarlo agli utenti – hyena

2

ho trovato il metodo "WTF" (quello che un terribile fallimento) nella classe Log . Dalla descrizione:

A seconda della configurazione del sistema, una relazione può essere aggiunto al DropBoxManager e/o il processo può essere chiuso immediatamente con un messaggio di errore.

http://developer.android.com/reference/android/util/Log.html

Spero che questo aiuti qualcuno

Problemi correlati