poniedziałek, 17 lutego 2014

Stosowanie usług sieciowych (Web Services) z poziomu Androida


Kod źródłowy do tej lekcji znajduje się tutaj. Rozpakuj go i zaimportuj. W katalogu z kodem źródłowym znajdą się podkatalogi oznaczone numerami. Są to po prostu kolejne wersje kodu, tworzonego w ramach przykładów. Możesz analizować kolejne kroki tworzenia aplikacji, lub od razu zabrać się za kod z katalogu o najwyższym numerku.


Web Services możemy stosować w Androidzie tak jak w każdym innym programie napisanym w Javie, z tą różnicą że tutaj musimy pamiętać o kilku dodatkowych wymogach. Ponieważ stosowanie z usług sieciowych wiąże się z korzystaniem z sieci (jak sama nazwa wskazuje :) ), musimy zadbać o odpowiednie uprawnienia aplikacji. Z tego tytułu dodajemy wpis :

<uses-permission android:name="android.permission.INTERNET" />

po tagu </application> a przed </manifest>. Jest jeszcze jedna bardzo ważna sprawa – jeśli chcemy korzystać w aplikacji z usług sieciowych, musimy to robić w osobnym wątku. Jeśli o tym zapomnimy, Android i tak nam o tym przypomni rzucając na konsolę komunikat :
StrictMode$AndroidBlockGuardPolicy
Ja zrobiłem to przy użyciu osobnej klasy dziedziczącej po AsyncTask, choć jeśli chcesz możesz zastosować zwyczajny obiekt klasy Thread. Na poniższej ilustracji zczytałem zawartość naszej strony internetowej i wyświetiłem ją na konsoli.



Wynik wyświetlony na konsoli:



To jest po prostu kod źródłowy strony internetowej, choć równie dobrze mógłby to być jakiś plik z danymi w XML.

Alternatywnie możemy wykorzystać gotową bibliotekę HttpClient od Apache, dzięki której nie musimy skupiać się tak bardzo na szczegółach implementacji czytania strumienia. Efekt jest zasadniczo taki sam, forma inna. Tutaj również musimy pamiętać o wydzieleniu osobnego wątku.





Zajmiemy się teraz odbieraniem obiektów XML przy użyciu usług sieciowych. Wrzuciłem na serwer przykładowy zasób XML, by mieć co przetwarzać. Ten plik tam pozostanie, więc możesz z niego skorzystać. Adres pliku: http://jsystems.pl/storage/dane.xml
Bazując na poprzednim rozwiązaniu przerobiłem klasę Watek. Kod odpowiedzialny za pobieranie danych przeniosłem do osobnej metody dawajDane. Przy okazji przerobiłem to tak, by adres serwera, port i zasób przekazywać przez parametry metody a nie robić tego „na sztywno”. Dorzuciłem też metodę dawajXml która korzystając z metody dawajDane odbierze dane w postaci String i odda jako obiekt DOM:



Metoda doInBackground korzysta z przed momentem opisanych metod i odbiera obiekt DOM. Metoda onCreate aktywności pozostaje bez zmian:


5 komentarzy:

  1. Znalazłem błąd w tekście "Ponieważ stosowanie z usług sieciowych", pierwszy akapit ;)

    OdpowiedzUsuń
  2. W jaki sposób wyświetlić to co zostało pobrane ?

    OdpowiedzUsuń
    Odpowiedzi
    1. wyświetlasz zmienną (w tym przypadku "d" np. poprzez TextView

      Usuń
  3. W jaki sposób zrobić progressBar, który będzie się zwiększał (w metodzie onProgressUpdate) podczas przesyłu danych? (chodzi mi o progressBar poziomy)
    Nie wiem jak dostać wielkość danych co mają być przesłane i jak tą informację wykorzystać przy zwiększaniu progressBara.

    OdpowiedzUsuń
  4. W jaki sposób wysyłać dane z telefonu na serwer? Chodzi mi o coś takiego, jak w przypadku formularzy na stronach internetowych: użytkownik np. wpisuje jakiś tekst, łączy się z odpowiednią stroną przesyłając te dane metodą Get lub Post, a potem działający na serwerze skrypt PHP coś z nimi dalej robi.

    OdpowiedzUsuń