Per la mia app ho bisogno di contattare la nostra API dal nostro server che restituisce alcuni JSON.Android: ottenere risultato da callback (networking KOUSH ION)
Durante il download del JSON, dovrebbe visualizzare una barra di avanzamento.
ho pensato dovrei usare AsyncTask
di Android per gestire l'interfaccia grafica, mentre facendo le operazioni di rete, così ho scritto il seguente nel mio Activity
:
class DownloadManager extends AsyncTask<String, Void, Boolean> {
@Override
protected void onPreExecute() {
super.onPreExecute();
mLoadingSpinner.setVisibility(View.VISIBLE);
}
@Override
protected Boolean doInBackground(String... params) {
String id = params[0];
downloadUtility.getId(id);
return true;
}
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
mLoadingSpinner.setVisibility(View.INVISIBLE);
}
}
In sostanza, onPreExecute
mostra il filatore di carico, il doInBackGround
downloads alcuni JSON, e onPostExecute
interrompe la selezione.
La domanda è, all'interno del downloadUtility.getId(id)
ho bisogno di uno:
- Aprire un nuovo intento se il download è riuscito .
- Rimanere sulla stessa attività e visualizzare un messaggio di errore se il download non è riuscito.
Il codice per la getId
:
public Future getId(final String id) {
// set url
String url = IPAddress.PRODUCTION + Variables.get_id+ id;
downloading = Ion.with(context)
.load("GET", url)
.asJsonObject()
.withResponse()
.setCallback(new FutureCallback<Response<JsonObject>>() {
@Override
public void onCompleted(Exception e, Response<JsonObject> response) {
//try catch here for null getHeaders
if (response != null) {
if (response.getHeaders().code() == 200) {
//SUCCESS !! Open new intent!
} else {
//FAIL!! Show TOAST!
}
}
}
});
return downloading;
}
Come potete vedere, sto tornando un oggetto futuro. Come faccio a sapere dall'oggetto futuro se lo onCompleted
(void) ha dato esito positivo o negativo, quindi posso gestire il risultato (successo: aprire nuovo intent, fail: toast) nel asynctask?
Ciò non significa che si scriverà codice di download all'interno di una classe di attività? Il motivo per cui ho creato una classe DownloadUtility è di eliminare l'intero fatto di inserire il codice di download all'interno di un'attività e inserirlo in una classe a cui appartiene. –
Sì, crea una classe separata e in una funzione aggiungi questo codice in modo da renderlo separato – Rahul
Se crei una classe separata, non potrei chiamare mLoadingSpinner poiché la classe non è un'attività. Potrei passare loadingspinner nel costruttore dell'oggetto downloadUtility, ma non sarebbe il modo migliore. (Una volta ho provato questo). Inoltre, per aprire un nuovo intent da una non attività, dovrei usare un FLAG per aprire una nuova attività da una classe normale .. che non è bello codice –