Dla mojej aplikacji muszę skontaktować się z naszym API z naszego serwera, który zwraca niektóre JSON.Android: uzyskaj wynik z oddzwonienia (sieć KOUSH ION)
Podczas pobierania JSON powinien wyświetlać pasek postępu.
Pomyślałem powinienem używać Androida AsyncTask
do obsługi GUI podczas wykonywania operacji sieciowych, więc pisał w moim 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);
}
}
Zasadniczo onPreExecute
pokazuje spinner ładunku, doInBackGround
pobiera niektóre JSON, i onPostExecute
zatrzymuje spinner.
Pytanie brzmi, w downloadUtility.getId(id)
muszę albo:
- otworzyć nową zamiaru jeśli pobieranie udało.
- Pozostań na tym samym działaniu i wyświetl komunikat o błędzie, jeśli pobieranie nie powiodło się.
Kod dla 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;
}
Jak widać, jestem powrocie przyszłego obiektu. Skąd mam wiedzieć z przyszłego obiektu, czy onCompleted
(void) albo powiodło się, czy nie, więc mogę obsłużyć wynik (sukces: otwórz nowe intencje, nieudane: toast) w asynktasie?
Czy to nie oznacza, że napiszesz kod pobierania w klasie aktywności? Powodem, dla którego stworzyłem klasę DownloadUtility, jest pozbycie się całego faktu, aby umieścić kod pobierania w działaniu i umieścić go w klasie, do której należy. –
Tak, stwórz oddzielną klasę iw funkcji dodaj ten kod, aby można go było oddzielić – Rahul
Gdybym tworzył osobną klasę, nie byłbym w stanie wywołać mLoadingSpinner, ponieważ klasa nie jest działaniem. Mogłabym przekazać loadspinnera do konstruktora obiektu downloadUtility, ale nie byłby to najlepszy sposób. (Kiedyś próbowałem tego). Ponadto, aby otworzyć nowe intencje z braku aktywności, musiałbym użyć FLAG, aby otworzyć nową działalność z normalnej klasy .. co nie jest miłym kodem –