2013-10-25 16 views
12

Sto estendendo AsyncTaskLoader che uso in seguito in un frammento tramite LoaderManager. C'è un modo suggerito per gestire gli errori che si verificano durante l'attività asincrona? Vorrei far apparire un messaggio che chiede all'utente di annullare o riprovare quando si verifica un errore di connessione Internet.Come gestire gli errori in AsyncTaskLoader personalizzato?

L'unico modo a cui posso pensare ora è di fare in modo che Loader restituisca null in caso di errore o avvolga un oggetto caricato in un altro che avrebbe un codice di stato.

+0

Sei mai arrivato da nessuna parte con questo? Sto incontrando lo stesso problema ora che non ho più il valore di ritorno da 'AsyncTask's'' doInBackground' da controllare. – theblang

+0

Io uso per 3a risposta. – Malachiasz

risposta

16

Quello che abbiamo fatto nel nostro ultimo progetto: creare un involucro che contiene un generico e un excpetion come questo:

public class AsyncTaskResult<T> { 
    private final T result; 
    private final Exception error; 
    //getter & setter 
} 

cattura tutte le eccezioni nel vostro doInBackground(...) e comprimerle in involucro risultato (o il risultato, se nessun errore). Nell'interfaccia utente, controlla il wrapper se si tratta di un'eccezione, quindi mostra il messaggio di errore corrispondente, altrimenti compila i campi con il risultato.

Per noi è stata anche una buona pratica definire quali tipi unici di eccezioni ci sono (ad es. Eccezione con un errore recuperabile in cui si mostra solo una finestra di dialogo o un errore dell'app dove è necessario dare un calcio all'utente nel menu principale) e lancia solo questi tipi (nel prendere lo specifico nel tuo asynctask), così non devi preoccuparti di centinaia di eccezioni diverse e anche astrarre la gestione degli errori. Potresti anche fornire chiavi stringa con il messaggio di errore I18n corretto, quindi devi solo scrivere e.getMessage()

+0

Ho fatto pratica, ho fatto lo stesso –

+0

Ho fatto questo: 'MyLoader estende AsyncTaskLoader >' Puoi anche usare un 'Bundle' e avere una chiave per errori, se tutti i tuoi dati implementano' Parcelable' . –

+0

Letture rilevanti: http://tech.puredanger.com/2010/03/31/do-we-want-a-java-util-pair/ – for3st

1

Ho visto buoni risultati quando si restituisce un oggetto composito che contiene il carico utile (se presente) e un codice di stato, come suggerito. Quindi lo Fragment che ospita lo AsyncTaskLoader può visualizzare un errore appropriato e informativo. Questo approccio ha il vantaggio aggiunto di utilizzare il ciclo di vita del caricatore integrato.

Un'altra opzione è registrare un listener che il tuo AsyncTaskLoader notificherà quando si verificano errori. Il Facebook SDK ha un esempio di utilizzo di listener di errori con caricatori.

Problemi correlati