11

W aplikacji na Androida muszę przesłać wiele żądań GET do adresu URL w celu przesłania danych na zewnętrzny serwer (tak działa zewnętrzny interfejs API).Najlepszy sposób wysyłania żądań HTTP GET w trybie synchronicznym w systemie Android?

Dane przychodzą sporadycznie. Przechowuję te dane w kolejce i chcę je przesłać do serwera w tle asynchronicznie, bez spowalniania głównego wątku UI. Każda jednostka danych w kolejce wymaga żądania GET. Kolejka musi zostać opróżniona nawet po zamknięciu aplikacji.

Jaka jest najlepsza praktyka, aby to zrobić? Proszę wysłać/skierować mnie do kodu/samouczków.

Odpowiedz

27

Jaka jest najlepsza praktyka, aby to zrobić?

To zależy od tego, czym jest "to" i gdzie ta praca jest wykonywana.

Jeśli „to” jest „asynchroniczna praca”, można używać wątki w jednej formie lub mody:

  • Jeśli operacje HTTP prowadzisz UI, można użyć AsyncTask, więc można zaktualizować UI bezpiecznie z onPostExecute()

  • Jeśli operacje HTTP są czysto w tle, a chcesz zrobić po jednym na raz, użyj IntentService, który ma swój własny wątek tła i kolejkę pracy

  • Jeśli operacje HTTP są czysto w tle, a chcesz zrobić pojedynczo na czas, a ty obawiasz się o zapewnienie, że urządzenie powinno zasnąć podczas gdy wszystko to się dzieje, że mój WakefulIntentService

  • Jeśli urządzenie Operacje HTTP są czysto w tle, ale czujesz, że chcesz zrobić kilka naraz, przetasuj swój własny Service, który używa Executor z własną pulą wątków, upewniając się, że zamknąłeś tę usługę po zakończeniu pracy (jak IntentService ma) i upewniając się, że urządzenie nie śpi z urządzeniem WakeLock (i być może: WifiLock).

Jeśli "to" jest "HTTP GET" wnioski, zastosowanie:

  • HttpUrlConnection lub

  • HttpClient lub

  • OkHttp (otoki wokół tych z dodatkiem korzyści) lub

  • Retrofit (jeśli żądania GET są naprawdę połączeń usług internetowych) lub

  • Volley (jeśli lubisz swój kod otoki HTTP być nieudokumentowane, nieobsługiwane, ale Googly)

  • dowolną liczbę innych osób trzecich biblioteki wrapper

Jeśli „to” jest „kolejka”, użyć klasy Queue lub LinkedBlockingQueue jeśli plan mający wiele wątków z nim pracować jednocześnie.

Jeśli "to" jest czymś innym, nie mogę ci pomóc, ponieważ jestem zmęczony zgadywaniem.

+1

+1 za komentarz do Volley. ;-) –

+0

Uwaga: Volley jest teraz zarówno zalecaną najlepszą praktyką, wspieraną, udokumentowaną i nie dotyczy tylko żądań GET. – Nilzor

+0

@Nilzor: "zalecana najlepsza praktyka" - podaj linki do stron na stronie http://developer.android.com, które to wskazują. "obsługiwane, udokumentowane" - podaj linki do niektórych witryn (np. repozytorium GitHub), gdzie odbywa się wsparcie i gdzie znajduje się dokumentacja. "nie dotyczy tylko żądań GET" - nigdy nie powiedziałem, że było to * tylko * dla żądań GET. Pytanie * dotyczy żądań typu "GET". – CommonsWare

8

Można wykonywać własne asynchroniczne wywołania HTTP GET za pomocą AsyncTask, ale polecam go, chyba że robisz to z punktu widzenia nauki. Jeśli chcesz mieć ładne, czyste i stabilne rozwiązanie, proponuję użyć dobrze znanej biblioteki innej firmy Android Asynchronous Http Client. Ze strony:

"Asynchroniczny klient Http oparty na wywołaniu oddzwonienia na Androida oparty na bibliotekach HttpClient Apache. Wszystkie żądania są wykonywane poza głównym wątkiem interfejsu użytkownika aplikacji, ale każda logika wywołania zwrotnego będzie wykonywana w tym samym wątku, co wywołanie zwrotne zostało utworzone za pomocą przekazywania wiadomości Handler systemu Android. "

Making GET jest tak proste, jak:

AsyncHttpClient client = new AsyncHttpClient(); 
client.get("http://www.google.com", new AsyncHttpResponseHandler() { 
    @Override 
    public void onSuccess(String response) { 
     System.out.println(response); 
    } 
}); 
+0

Co stanie się, gdy aplikacja się zamknie? – ask

+0

Myślę, że aktualne żądanie asynchroniczne zostanie zakończone, ale w rzeczywistości nie jestem pewien. – britzl

+0

Ładna biblioteka. Gona, spróbuj tego w moim nowym projekcie. Dziękujemy – speedynomads

Powiązane problemy