Šalo na stran. Tu se podobnost s televizijskimi reklamami konča. Knjižnice, ki jih bomo tokrat spoznali, so zastonj in hkrati izpolnijo vse obljube.

Kako postanem član?

Kot ve vsak programer, ki piše že vsaj drugo aplikacijo v isti tehnologiji, velikokrat rešujemo iste oziroma zelo podobne probleme kot prejšnjikrat. Morda imamo isti način prijave uporabnika ali pa podoben način shranjevanja podatkov v bazo. Morda pa se nam zdi način, na katerega izvajamo določene operacije, neroden, nedodelan in bi se ga dalo napraviti lepše. Če imamo vsaj malo prav, je velika verjetnost, da se je s tem nekdo že spopadel, rešil ta problem in napravil iz tega knjižnico, ki jo moramo mi le še vključiti v svojo aplikacijo. Knjižnice so stisnjene datoteke s končnico .jar in vsebujejo razrede, ki namesto nas opravijo določeno delo.

Večina androidnih projektov je zgrajenih z orodji Maven ali Gradle. In najlažji način za uporabo knjižnic je, da jo preberemo iz repozitorija, iz katerega znata brati obe orodji. Kodo, ki je potrebna za uvoz določene knjižnice, najdemo na spletni strani le-te. Če želimo na primer uvoziti knjižnico Gson (ki jo bomo spoznali pozneje) v projekt, zgrajen z Mavenom, dodamo naslednjo kodo v projekt, in sicer v datoteko pom.xml znotraj značk <project><dependencies>:

<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.3.1</version>
</dependency>

Če je naš projekt zgrajen z orodjem Gradle, dodamo naslednjo vrstico v datoteko build.gradle pod dependencies:

compile 'com.google.code.gson:gson:2.3.1'

Tako Maven kot Gradle bosta znala poiskati izbrano knjižnico v repozitoriju, jo prenesti z interneta in jo vključiti v naš projekt. Poleg tega je preprosta tudi nadgradnja knjižnic – vse, kar moramo storiti, je, da spremenimo številko, ki označuje verzijo, in naše orodje bo ob naslednji gradnji uporabilo novejšo verzijo.

Vključitev knjižnic je torej preprosta, zdaj pa si poglejmo še, kaj dobrega nam posamezne knjižnice prinesejo.


Če knjižnice ni v repozitoriju Maven, je najboljše načelo, da si jo uvozimo v svoj lokalni repozitorij in jo potem v aplikacijo vključimo po istem načelu. Navodila za uvoz najdemo tu: http://goo.gl/17yYXW.

Gson

JSON je priročen format za prenašanje kompleksnih sklopov informacij v tekstovni obliki, ki je priporočena oblika za prenos podatkov med strežnikom in androidno aplikacijo. In Gson je Googlova knjižnica, ki namesto nas preoblikuje neko entiteto (instanco razreda v kodi) v ustrezen tekst in obratno, iz teksta ustvari instanco entitete. In to deluje celo za kompleksne modele.

Če imamo na primer razreda:

public class User {
String name;
int age;
Country country;
}

in

public class Country {
String name;
String code;
}

potem nam naslednja koda:

User user = new User("Misao Okawa", 117, new Country("Japan", "JP"));
String json = new Gson().toJson(user);

pretvori objekt user v tekst json:

{"name":"Misao Okawa","country":{"code":"JP","name":"Japan"},"age":117}

In obratno, če ta isti tekst uporabimo v kodi:

User user = new Gson().fromJson(json, User.class);

dobimo nazaj uporabnika z istimi polji.

To je zelo uporabna knjižnica za serializacijo, saj potrebujemo le eno vrstico za pretvorbo objekta v tekst in eno vrstico za obratno dejanje.

Retrofit

Knjižnica Retrofit je namenjena še lažjemu branju in pošiljanju podatkov na strežnik prek REST API-ja. Uporaba je sila preprosta, določimo samo URL-naslov, kot parameter damo morebitne podatke, ki jih posredujemo na strežnik, in rezultat je podatek v želeni obliki (tekst, številka ali pa konkreten objekt).

Narediti moramo le vmesnik, ki ima vse to določeno, knjižnica pa ga nato sama implementira. Če bi želeli na primer dobiti seznam projektov, ki jih ima uporabnik na portalu GitHub, bi napravili takšen vmesnik:

public interface GithubService {
@GET("/users/{username}/repos")
public List<Project> getProjects(@Path("username") String username);
}

Klic na strežnik pa bi nato izvedli s to kodo, ki prebere vse moje projekte:

RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("https://api.github.com")
.build();
GithubService service = restAdapter.create(GithubService.class);
List<Project> projects = service.getProjects("koncinar");

Zgornja koda bo šla na strežnik na naslovu https://api.github.com/users/{username}/repos in z njega dobila JSON tekst s seznamom projektov, ki pa ga bo samodejno pretvorila v ustrezen razred (v našem primeru Project.java) s pomočjo knjižnice Gson.

Ne pozabimo, da potrebujemo za branje podatkov s strežnika pravico za dostop do interneta: android.permission.INTERNET

In pa seveda, da novejše verzije Androida ne dovoljujejo direktnih klicev prek interneta na glavni niti programa, zato moramo to opravilo pognati v ozadju.

Butter Knife

Butter Knife je knjižnica za jasnejše povezovanje kode in grafičnih komponent ter akcij na teh. Običajno v razredu Activity napravimo polje, ki predstavlja neki grafični element, v metodi onCreate ga poiščemo (id), nato pa mu v kakšni tretji metodi (na primer ob kliku na gumb) spremenimo vrednosti. Knjižnica Butter Knife pa s pomočjo anotacij že ob definiciji polja pove, na kateri grafični element se bo polje vezalo (id), tako da nam ostane za implementacijo potem samo še akcija.

Ampak to še ni vse. Knjižnica še posebej zablesti pri obravnavanju akcij na elementih, na primer pritisk na gumb. Brez knjižnice moramo definirati polje, ki predstavlja gumb, ga poiskati v metodi onCreate, poslušati za kliki nanj in nato ob kliku klicati določeno metodo. Knjižnica pa to poenostavi do te mere, da moramo zgolj označiti metodo, da se požene ob kliku na element s podanim id-jem. Pa si poglejmo primer, kako ob kliku na gumb preberemo tekst iz vnosnega polja in ga prikažemo v drugem polju:

public class MainActivity extends Activity {
@InjectView(R.id.text_hello)
TextView helloText;

@InjectView(R.id.input_name)
EditText nameInput;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.inject(this);
}

@OnClick(R.id.button_apply)
public void apply() {
String name = nameInput.getText().toString();
helloText.setText("Hello, " + name);
}
}

Vidimo, da je koda res preprosta. Polja helloText in nameInput označimo z anotacijo @InjectView, ki ji podamo id-polja, kar bo pomenilo, da bo knjižnica samodejno poiskala ustrezna grafična elementa, ju nastavila v ti polji in poskrbela tudi za ustrezno pretvorbo. Metodo apply() pa označimo z anotacijo @OnClick, ki ji prav tako podamo id-gumba, na katerega želimo, da se ta metoda odzove. Vse ostalo je spet opravljeno samodejno.

Edino, kar moramo še dodati, je klic metode ButterKnife.inject(this), ki požene vso to opisano avtomatizacijo na trenutni aktivnosti.

Suger ORM

Ena od najbolj nadležnih nalog pri razvijanju aplikacije je shranjevanje entitet v podatkovno bazo, saj utegne biti to zelo zamudno delo. Knjižnica Sugar ORM nam to izredno olajša, saj sama ustvari razpredelnice, stolpce, vanje ustrezno zapiše podatke in jih po drugi strani tudi prebere. Najbolje, da si pogledamo kar konkreten primer.

Ko knjižnico vključimo v projekt, jo moramo aktivirati, in to storimo tako, da v datoteki AndroidManifest.xml znački <application> dodamo parameter:

android:name="com.orm.SugarApp"

Nato entiteti, ki jo želimo shraniti, dodamo nadrazred SugarRecord<T>. Če želimo shraniti uporabnika, bi bilo to videti tako:

public class User extends SugarRecord<User> {

}

To je vsa dodatna koda, ki jo potrebujemo, in že lahko uporabnike shranjujemo v bazo in beremo iz nje. Shranjevanje je videti tako, da kar na instanci razreda pokličemo metodo:

User user = new User("Misao Okawa", 117, new Country("Japan", "JP"));
user.save();

To je vse, uporabnik je že shranjen. Za branje vseh uporabnikov iz baze uporabimo:

List<User> allUsers = User.listAll(User.class);

Za iskanje natančno določenega uporabnika oziroma skupine uporabnikov pa lahko uporabimo naslednji klic:

List<User> oldestUsers = User.find(User.class, "name = 'Misao Okawa'");

Kot vidimo, je ta knjižnica izredno enostavna za uporabo in je zato zelo primerna za shranjevanje enostavnih entitet.

Zaključek

To je bilo le nekaj najbolj enostavnih knjižnic, ki jih lahko uporabimo v skoraj vsaki aplikaciji. Vseh knjižnic je seveda ogromno in izbrati najboljšo za trenutni projekt ni lahko delo, saj je treba biti pozoren na to, ali reši naše težave, ali ima morda kakšne hrošče, ki so za nas ključna prepreka, ali se knjižnica še aktivno razvija, kakšna je podpora tako razvijalcev kot uporabnikov. Potem je tu še pravni vidik – ali smemo knjižnico z določeno licenco uporabiti v svojem projektu. Ampak če potegnemo črto, se vsekakor izplača porabiti uro ali dve za raziskovanje in izbiro dobre knjižnice, kot da več dni razvijamo, čistimo in popravljamo svojo rešitev. In tako lahko čas, ki ga s tem prihranimo, porabimo za izdelavo boljše aplikacije. Ali pa za gledanje reklam.

| Moj mikro, marec – april 2015 | Rok Končina