Für meine App muss ich unsere API von unserem Server kontaktieren, die einige JSON zurückgibt.Android: Ergebnis aus Rückruf (Netzwerk KOUSH ION)
Beim Herunterladen des JSON sollte eine Fortschrittsanzeige angezeigt werden.
ich dachte, ich AsyncTask
Android verwenden sollten, um die GUI zu handhaben, während Netzwerkoperationen zu tun, also schrieb ich folgendes: In meinem 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);
}
}
Grundsätzlich onPreExecute
zeigt die Lade spinner die doInBackGround
lädt einige JSON, und onPostExecute
stoppt den Spinner.
Die Frage ist, in der downloadUtility.getId(id)
Ich muss entweder:
- Öffnen Sie eine neue Absicht, wenn der Download gelungen.
- Bleiben Sie bei der gleichen Aktivität und zeigen Sie einen Fehler an toast, wenn der Download fehlgeschlagen ist.
Der Code für die 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;
}
Wie Sie sehen, ich bin ein zukünftiges Objekt zurück. Woher weiß ich aus dem zukünftigen Objekt, ob die onCompleted
(void) entweder erfolgreich war oder fehlgeschlagen ist, damit ich das Ergebnis (Erfolg: neue Absicht öffnen, fehlschlagen: Toast) in der asynctask behandeln kann?
Bedeutet das nicht, dass Sie Download-Code innerhalb einer Aktivitätsklasse schreiben würden? Der Grund, aus dem ich eine DownloadUtility-Klasse erstellt habe, besteht darin, die gesamte Tatsache loszuwerden, um den Download-Code in eine Aktivität zu integrieren, und sie in eine Klasse zu stellen, in die sie gehört. –
yeah eine separate Klasse und in einer Funktion fügen Sie diesen Code, damit Sie es trennen können – Rahul
Wenn ich eine separate Klasse machen würde, wäre ich nicht in der Lage, die mloadingSpinner aufrufen, da die Klasse keine Aktivität ist. Ich könnte den loadingspinner in den Konstruktor des downloadUtility-Objekts übergeben, aber das wäre nicht der beste Weg. (Ich habe das einmal versucht). Auch, um eine neue Absicht von einem Nicht-Aktivität zu öffnen, müsste ich eine FLAG verwenden, um eine neue Aktivität aus einer normalen Klasse zu öffnen .. was ist kein netter Code –