czwartek, 5 grudnia 2013

Bezwartościowe.

Jeżeli interesuje Cię drogi czytelniku tematyka Androida, to może zainteresują Cię moje artykuły opublikowane w serwisie javastart.pl.
Screen orientation. - troszkę poprawiony artykuł na temat orientacji.
Broadcast Receivers - poprawiony art. o Broadcast'ach wraz z opisanym zagadnieniem Ordered Broadcast.

niedziela, 10 listopada 2013

Android: Runda druga[Broadcast Receivers]

Broadcast Receivers to element który umożliwia nam nadawanie wiadomości wewnątrz naszej aplikacji bądź poza nią - np: system może powiadomić nas o nadchodzącej rozmowie czy też rozładowanej baterii.
Żeby poprawnie stworzyć nasz Broadcast Receivers(łatwiej będzie po prostu receiver), musimy wykonać dwie czynności:
  •  Rozszerzyć przez naszego receiver'a klasę BroadcastReceiver która implementuje metodę onReceive(). 
  • Zarejestrować receiver'a, możemy to zrobić na dwa sposoby:
    • W kodzie - tak zarejestrowany  BroadcastReceiverer będzie nasłuchiwał tylko wtedy, gdy komponent w którym jest zarejestrowany działa. Dobrą praktyką jest rejestrowanie go w metodzie onResume(). Taki sposób jest przydatny kiedy receiver używany jest do aktualizacji komponentów UI(User interface).
    • W pliku Manifest naszej aplikacji, w tym przypadku, w przeciwieństwie do rejestracji w kodzie, nasza aplikacja będzie nasłuchiwać ciągle(np: kiedy przyjdzie sms'a, nasza aplikacja może się odpalić sama, i zapisać tego sms do bazy danych).

Przykład osadzenia rejestracji w kodzie: Osadzenie w manifeście: Mając już jakieś podstawy, spróbujmy stworzyć jakąś prostą aplikacje, aplikacje która będzie nasłuchiwać nadejścia wiadomości SMS, w przypadku nadejścia takiej wiadomości stworzymy sobie powiadomienie(Toast).
Najpierw tworzymy klasę rozszerzającą BroadcastReceiver oraz implementującą metodę onReceive(): Dane które otrzymuje nasz receiver dostarczane są w Intencie(wrzucamy je sobie potem do obiektu typu Bundle). Dalej, co to PDU ? "protocol data unit" - format dla ... teraz nie ważne, ważne że możemy sobie teraz stworzyć wiadomość sms(na której dalej będziemy pracować) z surowego obiektu PDU.
Na właśnie stworzonym obiekcie klasy SmsMessage możemy wywołać metody: getOriginatingAddress() oraz getMessageBody(), co robią - jedna jest odpowiedzialna za numer nadawcy(000-000-000) a druga to po prostu treść wiadomości.
Toast to małe okno typu popup, wypełnia tylko tyle miejsca ile musi, po pewnym czasie gaśnie. Tutaj mamy manifest, dodajemy do niego filtr dla naszego receiver'a(w tym przypadku nazwą jest BroadCast - czyli nazwa klasy). Dodałem także uses-permission - to deklaracja pozwolenia do odczytywania wiadomości SMS.

Dodatkowo, jeżeli chcieli byśmy odpalić nasz Broadcast Receivers z kodu(przyjmując że robi coś innego niż odbiera sms'a), możemy stworzyć sobie button'a, np: nazwa metody odpowiedzialnej za akcje to broadcastIntent, text który wypełnia button powinien być zapisany jako zasób(resource) np: @string/broadcast_intent. Tu mamy metodę która zostaje wywołana po wciśnięciu buttona - żądanie wysyłamy po przez metodę sendBroadcast(); jako parametr przekazujemy wcześniej stworzoną intencję. Do intencji możemy wsadzić jakieś dane przy pomocy metody putExtra("name", "value"); - w przypadku bardziej skomplikowanych klas, musimy zaimplementować interface serializable.

Jeżeli ktoś szuka czegoś więcej, może czegoś lepszego, to może znaleźć dobry tutorial tu:android4devs

sobota, 9 listopada 2013

Android: Runda pierwsza[Screen orientation]

Ostatnio na tapecie mam Androida, przy braku czasu(co spowodowane jest maturą) to fajna alternatywa do "zabawy"(oczywiście w żadnym wypadku nie umniejszając tej technologi) - tak więc, kilka następnych wpisów będzie właśnie ów platformie poświęcone.

Jeżeli ktoś szuka fajnego wprowadzenia(po polsku), to znajdzie je tutaj(javastart)

A teraz do rzeczy, w tym poście zajmiemy się orientacją, urządzenia z Androidem przyjmują dwie pozycje:
Landscape:

Portrait:


Taką właściwość w telefonie - przepraszam - w smartphonie osiągamy oczywiście przechylając go, natomiast w emulatorze Eclipsa(ADT Plugin) używamy kombinacji ctrl+f11.

Do obsłużenia obu przypadków, potrzebujemy dwóch wersji naszego layoutu, Android jest na tyle inteligenty(w końcu jądro linuxa ;D ) że wystarczy stworzyć dodatkowy folder o nazwie "layout-land" który odpowiada za orientację "landscape" - System sam wybierze który layout jest potrzebny.

Teoretycznie na tym można zakończyć, ale razem z tematem orientacji wiążę się pytanie, jak obsłużyć sobie taką zmianę w kodzie ?
A no nie jest to nic trudnego, wywołujemy metodę getConfiguration() która należy do klasy Resources - aktualny zasób możemy natomiast zdobyć przy pomocy metody getResources(), czyli np: Przykład jak można zastosować takie sprawdzenie:

czwartek, 22 sierpnia 2013

Asercje.

Przelatując przez przestrzeń zwaną "SCJP Sun Certified Programmer for Java 6" spotykam całkiem przyzwoitą liczbę tematów które opisują mechanizmy o których pojęcia nie miałem(w sumie to nic dziwnego, to tej pory nie przywiązywałem to "teorii" specjalnej uwagi, a to błąd, wielki). Dzisiaj pękł rozdział o m.in wyjątkach i ... asercjach.

Rozdział piąty to było właśnie moje pierwsze spotkanie z asercjami, i trochę na zasadzie notatki zamierzam je w tym poście opisać.
Asercje czym one są ? najprościej, jest to mechanizm umożliwiający nam sprawdzenie pewnego założenia, jego spełnienie nie powoduje nic, a niespełnienie obdarowuje nas AssertionError'em.
I właśnie o ten error chodzi :) bo pomimo tego że możemy go wyłapać, to nie robimy tego i dzięki temu mamy dobrze widoczny sygnał: "gościu coś poszło nie tak".
Przykład naprawdę prostego warunku z użyciem asercji wygląda mniej więcej tak: Autorzy książki wspomnianej wyżej dzielą rodzaje asercji na dwa typy, na proste i naprawdę proste(ciekawe nie ?). Przykłady drugiego("naprawdę prosty") to ten powyższy. Prosty daje nam jeszcze możliwość "dopisania" komentarza który pojawi się podczas wyrzucania AssertionError. Na przykład:
Asercji jako takich możemy używać także jako aktywnych komentarzy :) Wyglądają jakoś tak bardziej naturalnie od zwykłych //komentarzy. Na koniec w telegraficznym skrócie:
-Asercje dostępne są od wersji javy 1.4
-We wcześniejszych wersjach można używać słowa assert jako np: nazwy zmiennej, więc w przekładaniu historycznego kodu na bardziej "nowoczesny" mogą wystąpić problemy.
-Domyślnie asercje są "zdezaktywowane" - można je włączyć z poziomu konsoli: java -ea ...
-Bez problemu można je aktywować je dla danej klasy bądź katalogu.
-Używamy ich w metodach prywatnych. Przy ich pomocy nie sprawdzamy jednak argumentów podanych do metod publicznych bądź podanych przez "liczbę poleceń".

Więcej dobrych przykładów użycia można znaleźć tutaj:KLIK

czwartek, 8 sierpnia 2013

GroovyFX

Ten post jest totalnie bezwartościowy pod względem merytorycznym, ale co tam, raz się żyje :)
Przeglądając sobie otchłań internetu natknąłem się na dość ciekawy projekt, i ze względu na to że temat FX'ów był tu poruszany w chyba wszystkich postach, szkoda mi było o tym nie napisać.
Tym projektem jest GroovyFX - poziom słodkości tej nazwy jest równy poziomowi słodkości kotków z tych wszystkich fajnych obrazków.
Ale wracając do samego Groovego, to dopiero teraz zobaczyłem jak w tym się w ogóle piszę, i wygląda to genialnie. Nie chce się napalać ale ten język jest stworzony do pisania okienek :) Źródło zwykłego okienka wygląda tak(kod sobie pożyczyłem z głównej strony projektu):
Od strony samej technologi, to twórcy piszą że nasz kod w GroovyFX będzie łatwiejszy do zrozumienia i utrzymania, i patrząc na ten prosty przykład, trudno się nie zgodzić. GroovyFX nie odstaje niczym od JavaFX(przynajmniej tak piszą), więc trzeba spróbować.



Nie pozostaje nic innego jak napisanie czegoś w tym Groovym.

wtorek, 6 sierpnia 2013

Anonymous class & KISS

Dawno nic się nie pojawiło, wakacje w końcu. Fajnie jest nic nie robić, ale jednak i to się w końcu nudzi :)
Czytając sobie o klasach anonimowych, przypomniał mi się ostatni post na tym blogu(Lista-jak wypełnić?). I tak o to wpadł do głowy pomysł na szybki post(taki w sam raz na sierpień :D ).
Klasy anonimowe - tak jest, jak ktoś jeszcze nie wie co to za cudo, to śpieszę z wyjaśnieniem. Klasy anonimowe to wynalazek, który umożliwia nam tworzenie bardziej zwięzłego kodu, deklarujemy oraz inicjalizujemy w jednym momencie(programistyczny fast food).
Znamy to na przykład z deklaracji akcji buttonów:
Osobiście pomyślałem że przy okazji poprawię kod z ostatniego posta(w końcu "Keep It Short and Simple"). A więc, stary fragment: I nowa wersja:
I jeszcze coś, dlaczego ta anonimowa klasa nazywa się Runnable, jeżeli powinna go implementować ? tak właśnie, good for you !


Więcej na temat anonimowych klas tutaj.

wtorek, 25 czerwca 2013

Lista - jak wypełnić ?

Jako iż ostatnio nie miałem pomysłu na jakikolwiek post, pomyślałem o przykładzie wypełnienia zwykłej listy z innego wątku niż "javafx application thread"(tak to ten który nie lubi żeby mu się wpychać na siłę ze zmianami).

Przykład wygląda tak:
A co w kodzie ? standard, metoda start(która nawiasem mówiąc jest wykonywana zaraz po init()),
w niej obiekt klasy Scene(która jest kontenerem dla wszystkich innych elementów).
Wcześniej przed metodom start mamy jednak deklaracje samej Listy(ListView) oraz ObservableList(która odpowiada za przechowywanie listenerów mogących śledzić zmiany, kiedy te wystąpią).
Na samym końcu metody start uruchamiamy wątek, który wypełni Liste elementami 0-9(w pętli).
Wątek aktualizuje liste poprzez zwykłe dodanie elementu do listy. Ze względu na to że chcemy dostać się do javafx application thread(czyli głównego wątku aplikacji) korzysta z metody runLater z klasy Platform, bez skorzystanie z dobrodziejstwa klasy Platform moglibyśmy zostać obdarowani brzydkim wyjątkiem(pisałem o tym post wcześniej).

Odnoście samej klasy FXCollections to jest to kopia java.util.Collections z tym wyjątkiem że FXCollections zwraca ObservableList.

Rezultat, prymitywny bo prymitywny(ale działa ;D):

sobota, 11 maja 2013

na "ty" z twitter4j

Platforma Twitter'a udostępnia biblioteki dla sporej liczby technologii, w tym dla Javy.
Dlatego dzisiaj spróbujmy połączyć się z naszym Twitterowym kontem, pobrać najnowsze twitty oraz samodzielnie coś udostępnić. Korzystać będziemy z biblioteki o nazwie twitter4j [strona domowa projektu: Twitter4J].

twitter4j daje nam kilka sposobów na autoryzacje(więcej o tym tu), nas interesuje opcja numer 2.
Do autoryzacji posłuży nam klasa o nazwie ConfigurationBuilder - wygląda tak:
By pomyślnie zakończyć proces "wypełniania" obiektu klasy poprawnymi danymi, należy je zdobyć. Logujemy się na dev.twitter.com -> wypełniamy niezbędne pola.
Posiadamy już Consumer key,Consumer secret, Access token oraz Access token secret.

Teraz pobieramy oś czasu twitter.getHomeTimeline();, getHomeTimeline zwraca nam 20 najnowszych tweetów. Zaimplementowana lista wygląda mniej więcej tak: getScreenName - nazwa użytkownika który tweeta udostępnił.
getText - treść tweeta.

Żeby udostępnić tweeta musimy zmienić opcje dostępu, w tym celu wchodzimy w ustawienia aplikacji(Settings) zmieniamy jej typ z "Read only" na "Read and Write", zmieniamy Access token oraz Access token secret (mogliśmy to zrobić na samym początku, mogliśmy).
twitter.updateStatus("tresc") - pozwala na aktualizacje statusu.
Dokładając do tego jedną pętle można poskładać prostą, działającą aplikacje :)

niedziela, 24 marca 2013

Wielowątkowo

Niedawno miałem problem z wypisaniem danych(adresów email,tytułów wiadomości oraz dat otrzymania) do tabeli(TableView), problemem była taka integracja - by TableView uzupełniał się podczas uruchamiania i po jego zakończeniu(jest to o tyle upierdliwe że wiadomości są dość ciężkie i trochę to trwa).
Naturalnym jest sięgnięcie po wielowątkowość - wszystko pięknie, bach wątek: uruchamiamy go w metodzie odpowiedzialnej za inicjalizacje(u mnie jest to "initialize" w kontrolerze).
Tylko co teraz ? na pierwszy rzut oka wszystko powinno działać - od naciśnięcia "run project" dzielą nas już nie minuty a sekundy, odpalamy i ... BUM
NullPointerException...
WTF ? no niestety jak ktoś robi tak jak ja, najpierw naskrobie - potem się dowie, ląduje z nullpointerami i innymi dobrodziejstwami wyjątków. Dziwne było to że TableView wypełniał kilka pierwszych pól(różnie 10-15-30). W momencie którym aplikacja czekała na wykonanie wątku wszystko było ok(prócz czasu uruchamiania, średnio 30sekund).
Na szczęście stackoverflow :* Okazało się że nie możemy modyfikować niczego co pracuje akurat z aktywną sceną - nasz wątek musimy wykonać w wątku aplikacji(javafx application thread), możemy to zrobić za pomocą runLater albo runAndWait.
Po modyfikacji wyglądać to będzie tak:
Jeżeli chodzi o wielowątkowość w JavaFX to materiały o niej nie są jakoś oszałamiające, ale jest nadzieja ! podobno w JDK 8 ma się coś poprawić :)

niedziela, 10 marca 2013

JavaFX integracja z CSS

CSS czyli Kaskadowe arkusze stylów pozwalają nam określić sposób wyświetlania elementów(w tym przypadku) aplikacji. Oracle zapewnia całkiem przyjemne tutoriale - dla CSS w FX też się znalazł: Fancy Forms with JavaFX CSS.

My dokończymy dzisiaj program rozpoczęty w ostatnim poście. Jako że nie ma co przesadzać(bo co tam można upiększyć :D ) - zmienimy tylko tło oraz dodamy jakiś efekt przyciskom.
Pierwszą rzeczą jaką zrobić trzeba to stworzenie pliku CSS. Druga rzecz to "zapoznanie ze sobą" naszego pliku CSS oraz wcześniej stworzonego pliku FXML. W pliku FXML dodajemy: Teraz będziemy modyfikować plik CSS. Dodamy nowe tło(białe nie wygląda najlepiej). W tym celu dodamy właściwość dla background-image. .root - określa nam właściwość dla instancji sceny.
-fx-background-image - tło pobieramy z pliku(url("sample.jpg"))
-fx-background-color: - w tym przypadku wygenerowało by nam tło z podanego przez nas koloru(np: #2A5058)
Ja zwiększyłem sobie jeszcze rozmiar tekstu o kilka px: -fx-font-size: 13px;

Mamy już tło(inwencja twórcza wskazana) teraz czas na przyciski. -fx-text-fill:white; - wypełnienie tekstu.
-fx-font-family:"Arial Narrow"; - jego czcionka.
font-weight: - "waga czcionki".
-fx-background-color: linear-gradient(#61a2b1, #2A5058); - generujemy kolor tła.
-fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.6) , 5, 0.0 , 0 , 1 ); - JavaFX CSS Reference Guide

:hover - odpowiada za aktywną wersje pola(tu przycisku).

Właściwości takie jak .button czy .Text odpowiadają za "ogół". Jeżeli chcemy być bardziej szczegółowi - i chcemy odnieść się do jednego przycisku czy pola możemy odnieść się do stworzonego przez nas id pola np: fx:id="actiontarget" w takim przypadku odniesienie w CSS wyglądało by następująco:
Dzięki tym 14 linijką app. wygląda trochę bardziej znośnie :) moim zdaniem nie wyszło najgorzej.

czwartek, 28 lutego 2013

JavaFX review

Jakoś nie spotkałem zbyt wielu postów o JavieFX (a jest warta uwagi) więc postanowiłem napisać coś od siebie. Czym właściwie jest JavaFX ? większość już pewnie spotkała się z tą technologią ale dla niewtajemniczonych: jest alternatywą dla wysłużonego już Swinga, udostępnia naprawdę ładnie wyglądające elementy przy pomocy których można budować całkiem miłe dla oka aplikacje.
Jakby ktoś chciał więcej to KLIK

W tym poście chciałem pokazać(raczej po łebkach) budowę prostej aplikacji za pomocą której możemy zalogować się na naszego e-mail'a oraz wysłać z niego prostą wiadomość tekstową(mówiąc prościej, bardziej rozbudowany Hello World).

Jeżeli ktoś nie posiada JDK w wersji 7, możesz pobrać FX'a dla wersji 6.

A i jeszcze jedno, mój projekt nosi nazwę SimpleJavaFXexample(jakby ktoś chciał kompilować). Najpierw stworzymy sobie sam interface ( trochę na opak, ale tak mi wygodniej ). Dodamy 4 pola z których pobierzemy port, adres serwera smtp, email i hasło, dodatkowo jeden button też się przyda(akcje do niego dodamy potem).

Co robi TextField oraz Label raczej nie trzeba tłumaczyć, ale ciekawy jest HBox - możemy sobie nim wygodnie "manipulować" (taki fxml'owy div).

Teraz przydało by się stworzyć kontroler(umieścimy w nim na starcie akcje dla buttona i zmienne które odpowiadają za tekst wprowadzany do pól). Jest też widok do którego dodałem metodę pobierającą instancję - dzięki temu będziemy mogli wywołać changeStage w kontrolerze. Żeby sfinalizować nasz "związek" musimy zaktualizować kontroler: Teraz po naciśnięciu przycisku "Dalej" przeładujemy plik fxml z Sample.fxml na finalFXML.fxml(który teraz stworzymy ):

Teraz zostaje nam dopisanie(w kontrolerze)akcji dla dwóch przycisków i dwóch pól zadeklarowanych w finalFXML.fxml: Ostatnim krokiem będzie stworzenie klasy odpowiedzialnej za wysyłanie wiadomości. Do tego musimy użyć JavaMail'a którego można pobrać tu: KLIK
Klasa SendClass (nazwa bardzo oryginalna, wiem:)) prezentuje się następująco: Musimy dodać do kontrolera kila pól oraz zaktualizować metody o kilka linijek: To wszystko zebrane do kupy, skompilowane i uruchomione powinno wysyłać wiadomości z tytułem "test"(dodanie pola do wpisywania tematu to powiedzmy zadanie domowe :)). Uruchomiony appek wygląda tak:



*Do wysyłania wiadomości email wykorzystałem kod pochodzący z:KLIK
P.S W następnym poście poprawimy wygląd tego cuda za pomocą CSS'a.