Pierwsze kody związane z czatem już na guthub’ie.

Siemanko

W od kilku postów wiecie, że przymierzałem się do rozpoczęcia prac na czatem i ogólnie komunikacją między użytkownikami aplikacji mobilnej w czasie rzeczywistym. Dziś nastał ten dzień , że już pierwsze kody możesz zobaczyć w repo, a w tym poście pierwsze screen’y i zdjęcia z wymiany informacji pomiędzy klientem, a serwerem. W tym odcinku klientem jest nasz (mój i mojej narzeczonej) „pitbull” o imieniu Dosia 😉

Aplikacja mobilna klientem SignalR

W projekcie Xamarin napisałem w portable class library klienta SignalR dzięki czemu będę mógł go wykorzystać cross-platform’owo (może kiedyś)Z tego klienta korzystam w projekcie androidowym w nowo utworzonym serwisie, który będzie odpowiedzialny za komunikację z serwerem SignalR. Połączenie i komunikacja odbywa się w oddzielnym wątku przez co nie będzie ona wpływać na responsywność apki.

Serwer SignalR

W projekcie backend’u napisałem (zbyt dużo powiedziane bo to dopiero kilka linijek) serwer SignalR. Będzie on oczywiście odpowiedzialny za komunikację, ale chcę aby działo się w nim znacznie więcej. Mianowicie chcę zapisywać sobie informację o tym, który użytkownik jest online, zapisywać do bazy konwersacje między użytkownikami i wiele innych. Nad tym będę pracował w najbliższym czasie. Jak na razie serwer SignalR tylko odbiera jedną określoną wiadomość i na nią odpowiada.

Pierwsza komunikacja real time

Odpalając aplikację mobilną wysyłam wiadomość do serwera SignalR:

a1

Screen serwera SignalR w trybie debug

w odpowiedzi zwracam wiadomość, którą obsługuję w aplikacji poprzez odpalenie tzw. notification – czyli powiadomienia:

2

IMAG0058

Po kliknięciu powiadomienia przeniosę użytkownika na widok wiadomości (którego jeszcze nie ma). Na tę chwilę przenoszę go na listę ogłoszeń, ale to jest teraz nieistotne bo najważniejszym było obsłużenie komunikacji.

Serwis android’owy korzystający z klienta SignalR działa w tle, także mimo iż aplikacja nie jest odpalona (tzn. nie ma jej na ekranie, ale jej proces działa) wiadomości są odbierane.

IMAG0061

3

IMAG0071

W tym momencie kliknięcie powiadomienia przeniesie użytkownika do aplikacji. Normalnie jak w messengerze! 😉

Podsumowanie

Trochę się obawiałem, ze będzie to trudny task i zajmie mi to trochę czasu zanim cokolwiek zacznie działać,  a ku mojemu zaskoczeniu SignalR jest na tyle zajebisty, że wystarczy tylko kilka linijek aby już zacząć komunikację. To już za mną dlatego teraz muszę ogarnąć cały tzw. workaround żeby w pełni zaimplementować funkcjonalność komunikacji między użytkownikami aby mogli bez problemów dogadać szczegóły dotyczące transakcji ;).

Pjona!

Reklamy

Wracam po tygodniu przerwy. Podsumowanie dwóch miesięcy pracy nad projektem „Mobile Second Hand”

Siemanko

Chciałbym sobie schlebić i napisać, że pewnie zauważyłeś/łaś przerwę w moim blogowaniu oraz commitowaniu do repo na tydzień, jednak stąpam twardo po ziemi i godzę się z tym, że oprócz mnie samego nikt zapewne nie dostrzegł tej ogromnej luki w polskim internecie 😉 Jeśli jednak chcesz się ujawnić i pochwalić, że należysz do, bądź co bądź, elitarnego grona czytelników (jak czegoś mało tzn., że nie dla wszystkich ;)) to daj znać pod spodem. W dzisiejszym poście podsumowanko dwumiesięcznego blogowania i kodowania.

Staty z wodpressa

Nie wiem czy to śmiesznie mało, czy normalnie jak na początek, ale na dziś tj. 04.05.2016 wordpress zanotował przez niewiele ponad dwa mieisące 794 wyświetlenia i 439 gości na blogu.

1

Blogowanie

17 postów konkursowych i 2 posty niezwiązane z #dajsiepoznac opublikowane zaraz po stworzeniu bloga, ale jeszcze przed startem konkursu. Staram się nie pisać żadnego pierdololo, by tylko spełnić wymóg dwóch postów tygodniowo, dlatego przyjąłem zasadę: najpierw kodowanie potem blogowanie, aby mieć się czym dzielić. Posty publikuje w regularnych odstępach czasu w te same dni tygodnia – środa i niedziela.

Kodowanie

Android Studio – moim zdaniem bardzo young developer friendly środowisko. Wiele gotowych template’ów z których, świeżaki mogą szybko wgryzać się w Androida. Fajne funkcjonalności wspomagające refaktoryzację kodu i wiele innych.

Java – podobna do C#. W przypadku potrzeby przebranżowienia powinno pójść gładko

Asp.Net Core 1.0 – wersja RC1-final. Wszystko spoko. Wszystko wskazuje na to,  że będą musiał zrobić upgrade do wersji RC2 nightly builds ponieważ, chcę skorzystać z SignalR do zrobienia chatu dla userów aplikacji mobilnej. Mam nadzieję, że pójdzie w miarę gładko

Entity Framework Core 1.0 – trzeba zapomnieć o sposobie pracy z EF6. Brak automatycznej konfiguracji relacji wiele do wielu, kaskadowy zapis nie zawsze działa, usuwanie obiektów z kontekstu nie odzwierciedla się nigdzie do momentu wywołania SaveChanges(), bugi przy self reference i wiele innych ciekawostek. Zobaczę co poprawili w wersji RC2 jeśli uda mi się zupgradować projekt

Xamarin – fajne środowisko. Trochę wolne, ale .NETowe dobroci rekompensują wszystko. Przyspieszyłem z aplikacją mobilną od momentu rozstania z Android Studio, a kod jest dużo bardziej schludny i czysty.

Podsumowanie

Na pewno nie uda mi się skończyć projektu przed końcem konkursu. Im głębiej w las tym więcej chciałoby się funkcjonalności, a co za tym idzie jest więcej roboty przy niezmiennie małej ilości wolnego czasu. Po konkursie będę na pewno dalej pracował nad projektem. Czy blogował? Na pewno nie dwa razy w tygodniu, ale może raz na jakiś czas opowiem jakiś dowcip 😉

Pjona!

Lista ogłoszeń w aplikacji Mobile Second Hand – cz. 3.

Siemanko.

Dziś trzeci i zarazem ostatni wpis w tej serii dotyczącej tylko i wyłącznie części androidowej projektu, a konkretnie listy ogłoszeń. Sama lista nie jest jeszcze skończona i będę pracował nad nią nadal, ale dla zachowania parytetu między technologiami użytymi w projekcie staram się dzielić wpisy między owe technikalia. Zgodnie z zapowiedzią we wcześniejszym poście, dziś przybliżę nieco w jaki sposób ustalam lokalizację oraz jak pakuję zdjęcie z tablicy bajtów na widok. Z ogłoszeń parafialnych to wraz z nadejściem wiosny, mimo iż dzień dłuższy to czasu na klepanie w domu mam niestety mniej (sezon ligowy, sezon ogarniania podwórka, itp. ;)). Jednakże staram się jak mogę aby ciągnąć do przodu. Jako inną ciekawostkę przytoczę to, że zamówiłem sobie dwie książki do nauki androida. Jedna z serii „Head First” na temat programowania (tak na marginesie bardzo lubię tę serię i szczerze polecam) oraz jakąś na temat filozofii UI w aplikacjach androidowych. To tyle z ogłoszeń. Jedziemy z tematem.

GoogleApiClient i LocationManager

Z tego co wiem na tę chwilę to lokalizację telefonu można uzyskać dwojako. Za pomocą GoogleApiClient dostarczanego przez Google Play Services oraz za pomocą LocationManager wbudowanego w system androida. Jeśli chodzi o klienta google to jest on rekomendowany na stronie androida w sekcji treningu dotyczącej lokalizacji. Na pewno wymaga niewiele naszego kodu jednakże ja mam jakieś mieszane odczucia (może dlatego, że bawiłem się tym na samym początku gdy jeszcze moja znajomość androida była mikroskopijna?) bo miałem jakieś problemy z pobraniem lokalizacji. Szukając innych sposobów znalazłem właśnie rozwiązanie systemowe. Nie będę ukrywał, że implementacje jego wykorzystania zerżnąłem ze stacka, ale ważne że mniej więcej wiem o co kaman ;). W celu pobrania lokalizacji musimy w pliku AndroidManifest.xml dodać uses-permission dotyczące lokalizacji. „uses-permission” to wpisy, które informują system o tym do jakich modułów telefonu aplikacja ma mieć dostęp (sam to sobie tak tłumacze, ale może się mylę).

1

Jadąc od góry:

  • lokalizacja na podstawie sieci (stacje bazowe)
  • lokalizacja na podstawie sieci (stacje bazowe) i wi-fi
  • lokalizacja full wypas z powyższymi oraz z gps

Bez tych wpisów aplikacja się sypnie jeśli będziemy pytali o lokalizację. Ze względu na sporą ilość kodu serwisu GpsLocationService (tak go nazwałem) nie będą tutaj się więcej rozpisywał, ani wklejał screenów. Wszystko możesz oblukać w repo. Dodam tylko, że jest także obsłużona sytuacja gdy proszę o lokalizację, a tel ma wyłączony gps – wtedy wyświetlam monit z pytaniem czy user chce przejść do ustawień aby włączyć gps.

BitmapOperationService

Jak wiesz z poprzedniego wpisu zdjęcia ogłoszeń przesyłam jako tablice bajtów. Tę tablicę bajtów przerabiam na bitmapę w serwisie BitmapOperationService i łąduję ją do ViewImage poprzez setImageBitmap().

2

Jak widzisz oprócz tablicy bajtów (MainPhoto) do serwisu przekazuję także szerokość oraz wysokość ImageView, które znajduje się na fragmencie. Przekazuję wymiary po to aby wyskalować fotkę do wymiarów kontrolki. Jeśli jesteś ciekawy w jaki sposób to ponownie zapraszam do repo.

AdvertisementItemListActivityService

Po zmianie orientacji telefonu (nie, nie seksualnej) Activity czyli widok ulega zniszczeniu (nie jestem pewien czy całkowitemu) i zabawa zaczyna się od początku – czyli wywołanie metody onCreate(), ładowanie layout’u, kontrolek, danych itp. czyli wszystko zaczyna się od nowa w nowej konfiguracji urządzenia (czyli zmianie wymiarów ekranu). W przypadku mojej listy ogłoszeń wiązało się to z wysłaniem request’u do serwera, przeparsowaniu odpowiedzi na javove obiekty i ustawianiem adaptera. Ogólnie działo się to co przy pierwszym odpaleniu widoku z listą. Oczywiście nie było to przeze mnie pożądane działanie. Tuż przed zmianą konfiguracji urządzenia (czyli np. zmiana orientacji (też nie seksualnej) telefonu) można nadpisać metodę onSaveInstanceState(Bundle outState). Jeśli wpiszemy coś do obiektu Bundle poprzez jedną z jego metod put….(), możemy to potem wyciągnąć z Bundle przy starcie Activity w jej metodzie onCreate(Bundle savedInstanceState). Jednakże w ten sposób możemy wpisać tylko typy proste (string, int, bool, itp.). Dlatego tez zrobiłem sobie statyczny singleton AdvertisementItemListActivityService, w którym zapisuję listę ogłoszeń znajdującą się aktualnie w adapterze. W metodzie onCreate() odczytuje z serwisu zapisane obiekty i przekazuję je adapterowi. W ten sposób uniknąłem ponownego pobierania tych samych danych, a widok jest w tym samym miejscu listy ogłoszeń.

3

Metoda wywoływana tuz przed zmianą konfiguracji urządzenia

4

Kod w metodzie tworzącej activity. 

Podsumowanie

Zostało mi tu do ogarnięcia jeszcze page’owanie do infinity scrolla, który opisałem we wcześniejszym poście, oraz przejście do widoku detalu po kliknięciu na dane ogłoszenie. Oczywiście zostaje jeszcze kwestia ubrania tego wizualnie, ale najpierw ma działać, a później wyglądać. W następnych postach wracam do Asp.Net Core 1.0. O czym bedzie? No chyba coś o Entity Framework Core wypadałoby napisać 😉

Pjona!

Lista ogłoszeń w aplikacji Mobile Second Hand – cz. 2.

Siemanko.

Dziś druga część informacji na temat listy ogłoszeń w aplikacji mobilnej. Z poprzedniej części dowiedzieliście się, że skorzystałem z Fragment (List) – template’u  wbudowanego w Android Studio do generowania listy elementów widoku – który przerobiłem po swojemu. W tej części o tym jak go dostosowałem do swoich potrzeb.

Pobieranie ogłoszeń.

W metodzie onCreateView() activity (klasy) AdvertisementItemFragment będącej fragmentem (pojedyńczym elementem listy czyli ogłoszeniem) następuje wywołanie metody getAdvertisements(). Metoda ta, wywołuje serwis do pobierania ogłoszeń przekazując jego metodzie model ze współrzędnymi lokalizacji telefonu, z którego jest wysyłany request (o pobieraniu lokalizacji w następnym poście). Po co wysyłam współrzędne? To jest właśnie główny pomysł na tę aplikację – kojarzenie ze sobą ludzi w celu wymiany/sprzedaży ubrań w zadeklarowanym przez nich samych obszarze :). Wspomniany serwis z wykorzystaniem biblioteki Android Asynchronous Http Client (opisałem ją krótko w tym poście) uderza do WebApi w Asp.Net. W odpowiedzi dostaję jsona z listą ogłoszeń. Przy pomocy biblioteki Gson (którą również opisałem krótko w tym poście) parsuje stringi na javove obiekty ogłoszeń.

1

Parsowanie odpowiedzi (jsona) na obiekty javove z wykorzystaniem Gson.

Skrócony model ogłoszenia.

Aby nie pobierać całych ogłoszeń ze wszystkimi danymi, których i tak nie byłoby gdzie wyświetlić na liście (przy zachowaniu przejrzystości), zrobiłem skrócony model ogłoszenia do obsługi listy ogłoszeń.

2

Model ogłoszenia do wyświetlania na liście ogłoszeń

Modelu chyba nie muszę tłumaczyć poza polem Distance – jest to przybliżona odległość między użytkownikiem przeglądającym ogłoszenie, a autorem ogłoszenia w momencie jego utworzenia (wyliczona na serwerze). Zdjęcie przysyłam jako tablice bajtów (główne zdjęcia ogłoszeń, które mają być tzw. miniaturkami zmniejszam na serwerze w momencie zapisywania nowego ogłoszenia) i tu mam dla Was tipa co byście się nie musieli frustrować tak jak ja. Przy korzystaniu z Gsona’a do parsowania tablicy bajtów z jsona na obiekt javovy należy zadbać o to aby przy zwracaniu odpowiedzi z WebApi w Asp.Net skorzystać z JavaScriptSerializer i dane z kontrolera wypuścić jako string. Tablica bajtów zwracana przez wbudowany w Asp.Net Core 1.0 WebApi parser danych do jsona jest interpretowana (po stronie Androida) przez Gson jako ciąg znaków (string), a nie tablica bajtów.

Tak przygotowaną listę obiektów ładuję do ViewAdpatera.

3

Parsowanie odpowiedzi w formacie json na listę obiektów javovych oraz ustawianie ViewAdaptera .

Obsługa ViewAdaptera i customowy infinite scroll

ViewAdapter jest odpowiedzialny za wyświetlanie fragmentów. W metodzie onBindViewHolder(), która jest wywoływana tuż przed każdym wyświetleniem fragmentu, ustawiam wartości poszczególnych kontrolek widoku fragmentu odpowiednimi wartościami z modelu ogłoszenia.

4

Bindowanie danych z modelu ogłoszeń do kontrolek widoku fragmentu.

Holder to kasa, która trzyma referencje do kontrolek znajdujących się na widoku fragmentu. Jeden fragment na liście – jeden holder. Na powyższym screenie tuż przed zamykającym nawiasem klamrowym widać wywołanie metody:

checkIfThisItemIsLastAndRaiseOnInfinityScroll(holder, position)

Jest to mój pomysł na infinite scroll. W metodzie tej, sprawdzam index bindowanego obiektu ogłoszenia i porównuje go z długością listy wszystkich obiektów aktualnie znajdujących się w ViewAdapter’ze. Jeśli index jest ostatni to wywołuje odpowiednią metodę listenera, która odpala pobieranie danych.

5

Moja implementacji infinite scroll’a w ViewAdapterze.

Jak widać, zmienne lastHolder i lastPosition przechowują dane ostatnich elementów przed wywołaniem infinite scrolla, w celu doklejenia nowych danych do istniejącej listy bez zmiany widoku.

Screenshot_2016-03-23-18-16-03.png

Po doładowaniu danych użytkownik przegląda listę dalej od tego samego miejsca, w którym zaczęło się doładowywanie. Oczywiście będę musiał dopisać jakąś logikę dotyczącą pobierania danych wywołanych przez zdarzenia infinite scroll’a (jakiś paging itp.), ale to przecież się wciągnie noskiem 🙂

W następnej i ostatniej części opiszę co nieco jak ustalam lokalizację oraz jak ładuję fotkę z tablicy bajtów na widok.

Także Stej In Tacz!

Pjona!

Lista ogłoszeń w aplikacji Mobile Second Hand – cz. 1.

Siemanko.

Dzisiaj znów wracamy do części androidowej projektu. Ostatnio skupiłem się nad zwróceniem z serwera listy ogłoszeń z konkretnego obszaru wokół obecnej lokalizacji użytkownika (w sumie core aplikacji), przeparsowaniu jsona na Javove obiekty ogłoszeń i w końcu wyświetlenie ich na ekranie. Oto pierwszy „ładniejszy” efekt pracy. W tej serii (dwa lub trzy wpisy) postów skupię się tylko i wyłącznie nad częścią androidową. Pobieranie ogłoszeń z bazy oraz zwracanie ich z serwera opiszę w kolejnej serii.

WP_20160323_18_16_16_Pro

Zdjęcie prezentuje odpaloną aplikację na telefonie oraz rozlaną kawę na podkładko/notatniku.

Fragment i ViewAdapter.

Wiadomym dla mnie było, że ogłoszenia muszą być wyświetlane na scroll’owalnej liście. Tylko jak się do tego zabrać? Jak to jak?! Jak każdy szanujący się Full StackOverflow Developer zacząłem od grzebania w internecie 😉 Szybkie przetwarzanie informacji i już wiadomo, że do tego służą m.in Fragmenty i ViewAdaptery.

Fragment, to jak sama nazwa wskazuje, osobny byt reprezentujący jakiś element.

1

Screen z designera w Android Studio.

Na powyższym zdjęciu widoczne jest Activity (dziedziczące po Fragment) zawierające layout do prezentowania jednego ogłoszenia. W połączeniu z ViewAdapterem tworzy się lista takich fragmentów.

2

Screen z designera w Android Studio.

Ogólnie rzecz ujmując ViewAdapter zajmuje się wyświetlaniem elementów z kolekcji, którą mu przekażemy.

W najprostszy sposób taką listę można zrobić korzystając z gotowca wbudowanego w Android Studio (kolejny raz propsuje Android Studio i jego template’y).

3

Dodawanie template’u listy fragmentów do projektu w Android Studio.

Po wybraniu Fragment (List) do projektu wpadają dwa (dwie?) Activity (pliki .java z kodem i .xml z widokami), oraz klasa DummyContent.java, której obiekty będą wyświetlane na liście. Oczywiście template generuje dużo kodu do tworzenia fake’owych (DummyContent) obiektów, ładowania ich do adaptera, wyświetlania itp.. Jest to super punkt wyjścia do własnej implementacji. Ja oczywiście sporo zbędnego kodu pokasowałem i zaimplementowałem swoje rozwiązanie. Jakie? O tym w następnej części już w niedzielę.

Na koniec jeszcze jeden screen apki z telefonu:

Screenshot_2016-03-23-18-15-43

Screen aplikacji z małą czarną:)

Pjona!

 

MobileSecondHand – pierwsze widoki i funkcjonalności związane z autentykacją.

Siemanko.

Niedzielny wieczór więc pora skończyć kodzenie na dziś i naklepać trochę tekstu, którego nie da się skompilować 😉

Dziś trochę o starcie aplikacji i związanymi z tym faktem działaniami. Na zdjęciu wyżej widać ekran startowy. Prosty widok fullscreen z polem tekstowym i spinnerem, który ma dla bajeru pokazywać, że coś się w tle dzieje 🙂 Jako, że założenia aplikacji nie uwzględniają użytkowników anonimowych (żeby coś wystawić, lub żeby się skontaktować z właścicielem ogłoszenia to i tak trzeba będzie mieć konto) dlatego na dzień dobry po uruchomieni apki sprawdzam czy user jest zalogowany.

1

Autentykacja bazuje na tokenie, dlatego :

  • sprawdzam czy aplikacja ma zapisane w czymś co się nazywa SharedPreferences (to jest jakieś miejsce w pamięci przydzielone przez Android dla każdej z aplikacji – a przynajmniej tak mi się wydaje :)). Jest to kolekcja elementów klucz – wartość, czyli słownik. Jeśli wartość wyciągnięta z tego słownika jest różna od nulla tzn., że coś tu było działane i user może być zalogowany, ale token może być już przeterminowany dlatego uderzam na serwer.
  • jeśli nie ma w SharedPreferences tokena tzn., że jest to pierwsze uruchomienie apki po zainstalowaniu. MobileSecondHand – jak każda szanująca się apka 😉 – umożliwia zalogowanie przez facebook’a. Do tego wykorzystałem po stronie androida gotową biblioteczkę przygotowaną oczywiście przez facebook’a. Sprawdzam czy user logował się już do apki przez fejsa co sprowadza się do poproszenia o AccesToken. Jeśli jest różny od nulla to idzie na serwer i tam dokonuje się cała robota, a zwracany jest świeżutki bearer tokenik, który ląduje we wcześniej wspomnianych SharedPreferences . Jeśli jest nullem to ręcznie zwracam status 401 do activity, w którym wszystko się zaczęło, co jest informacją, że user musi się zalogować.2

WP_20160313_17_14_17_Pro

Wyżej widok logowania. Jak widać można to zrobić dwojako. Loginem i hasłem lub przez facebook’a. Jeśli standardowo to po prostu na serwer idzie POSTem model do logowania (już za chwilę opiszę jak obsługuje komunikację z serwerem). Jeśli user nie ma jeszcze konta i nie ma też facebook’a, może przejść do prostego widoku rejestracji.

WP_20160313_17_15_23_Pro

Tutaj to samo. Wypełnić, kliknąć i idzie model na serwer, a wraca token autentykacji.

Jeśli jednak w sytuacji gdy user nie ma konta, ale ma facebook’a i chce się przez niego lognąć (co jest jak wszyscy wiemy bardzo wygodne na mobilnych urządzeniach) to wystarczy, że kliknie na button, który jest także przygotowany przez facebook’a. Obsłużenie logowanie przez fejsa sprowadza się do zaimplementowania callbacka do buttona logowania z facebook’iem.

3.png

Resztę wykona za nas kod z biblioteczki facebooka.

WP_20160313_17_15_45_Pro

Jeśli wszystko pójdzie ok to mamy token od facebooka, który ja wysyłam na serwer i rejestruje/loguje usera oraz zwracam mój token autentykacji.

Android Asynchronous Http Client

Jako, ze na głównym wątku jedzie UI, do wykonywania czasochłonnych operacji trzeba tworzyć i wykorzystywać inne wątki. Niewątpliwie takimi operacjami są requesty do serwera. Znalazłem do tego świetną bibliotekę (tutaj). Jest bardzo prosta w użyciu dzięki dobrej dokumentacji. Wysłanie requesta sprowadza się do podania urla, i danych oraz obsłużenia zdarzeń po skończonym requeście.

4

Trzeba tylko mieć na uwadze to, że onFailure() nie będzie wywołane tylko wtedy gdy z serwera dostaniemy błąd. onFailure()  jest wywoływane gdy nie uda się odpowiedzi przerobić na obiekt JSON (w przypadku widocznym na zdjęciu, ale biblioteka umożliwia castowanie na wiele innych typów) choć status odpowiedzi może być 200.

GSON

GSON to biblioteczka to konwertowania obiektów Javovych na obiekty JSON oraz w druga stronę. Tutaj jest do niej link. Wystarczy podać typ obiektu, na który chcemy przerobić JSONa, lub wywołać toJson() jeśli chcemy obiekt Javovy przerobić na JSONa

56

Podsumowanie

Od autentykacji zacząłem projekt, także już kilkanaście albo nawet więcej godzin przy tym spędziłem. Mam na myśli oczywiście część androidową. Wygląd apki jak na razie jest prosty, bez fajerwerków. Skupiam się na funkcjonalnościach, a wygląd zostawię na koniec. W środę opiszę autentykację po stronie Asp.Net.

Pjona!

Wrażenia .NETowca w trakcie poznawania Android Studio

Siemanko. 

Niedziela, niedzielą, ale ostatni wpis był we wtorek, a zasady #dajsiepoznac kompetyszyn wymagają min. dwóch w tygodniu także nie ma, że boli, że się nie chce tylko od rana jest ostre kodowanko abym miał o czym pisać 😉 W tym wpisie podzielę się moimi wrażeniami na temat Android Studio i developmentu w tymże środowisku.

Jak już pisałem w w tym poście Java, Android i w ogóle development mobilny to dla mnie nowość. Pierwsza inicjacja z wyżej wymienionymi nastąpiła ok miesiąc temu. Postanowiłem zacząć po bożemu czyli odpaliłem pluralsight, pogrzebałem i znalazłem serię czterech filmów składających się na kurs „Android for .NET developers”. Pierwsze ruchy w Android Studio i pierwsze linijki kodu w Javie pisałem właśnie w oparciu o pierwszy film z serii. Kurs ogólnie spoko. Prowadzący wszystko rozkłada na czynniki pierwsze i dokładnie opisuje co trochę mnie zaczęło nudzić i w ok. połowie drugiego filmu postanowiłem już sam eksplorować ten temat w myśl zasady, że wiedza na temat jakiejś technologii jest wprost proporcjonalna do liczby naklepanych linii kodu, a nie liczby godzin obejrzanych kursów 😉

Moje pierwsze wrażenie na temat androida? – win forms na telefon :). A dlaczego? Proszę:

screen1

Jeśli ktoś klepał trochę w formsach to na pewno podziela moje pierwsze wrażenie. Po lewej przybornik z kontrolkami (w Androidzie – Views), na środku wizualizer, a po prawej Solution Explorer i Properties do kontrolek. I tak samo jak w formsach – przeciąganie, ustawianie właściwości itp. Jeśli chodzi o kod to w formsach mamy już referencje do wszystkich kontrolek w designerze i możemy się do nich odwoływać przez „this”, natomiast w androidzie  musimy każdą kontrolkę wyciągać poprzez findViewById()

screen2

Zaskoczyło mnie natomiast „wsparcie” zarówno w samym Android Studio jak i w dokumentacji Androida. W Androidzie widok jest nazwany Acitivity (Form w .NET). Chcąc dodać nowe Activity możemy wybrać z listy wstępnie ubrane i oprogramowane widoki, nawet z jakimiś prostymi logikami co baaardzo ułatwia wejście w Androida takim świeżakom jak ja.

screen3.jpg

Dokumentacja na stronie Androida jest bardzo obszerna, a sekcja nazwana „Training” zawiera wiele prostych, ale gotowych rozwiązań praktycznie dla każdej funkcjonalności związanej z aplikacją mobilną.

Struktura projektu na dzień pisania postu

screen4

Po lewej stronie widać otwarty folder (tak na prawdę to nie folder tylko paczka – coś jakby dllka w .NET) „activities” z plikami, z kodem Java. Są to widoki. Każdemu z tych plików są przypisane pliki .xml z folderów res->layout. Pliki z tego folderu to jest warstwa prezentacyjna widoku. W swoim projekcie podzieliłem pliki na foldery (paczki) jak widać wyżej.

Ogólnie podoba mi się Android i zaczyna mi już sprawiać frajdę (kilkanaście godzin już przesiedziałem z otwartym Android Studio) jednak pomieszanie warstwy logiki z warstwą prezentacji jest tu straszne. No i żeby coś sprawdzić to tak jak w formsach trzeba uruchamiać aplikację i się doklikiwać tam gdzie potrzebujemy. Na szczęście mam telefon z Androidem do celów czysto deweloperskich także nie muszę korzystać z emulatora wirtualnych urządzeń, bo ten strasznie długo się uruchamia, a na podłączonym kabelkiem telefonie aplikacja wstaje po kilku sekundach od uruchomienia jej w Android Studio.

To by było na dziś tyle. Trzeba wracać do życia rodzinnego. Posty będę starał się pisać w środy i niedziele wieczorami. W następnym poście opiszę nieco Asp.Net Core 1.0 i strukturę projektu w Visual Studio. Kolejne posty będą już stricte o funkcjonalnościach aplikacji, które napisałem do tej pory. Jeśli jesteś ciekawy już teraz to wszystko jest w repo.

Pjona!