Užitečné Android knihovny pro vývoj a testování

Preview:

DESCRIPTION

Prezentace s konference mDevCamp 2013 o Android knihovnách

Citation preview

Tomáš Kypta & Tomáš Vondráček

Užitečné Android knihovny pro vývoj a

testovánímDevCamp 2013

Představení

•Tomáš Vondráček & Tomáš Kypta

•Android vývojáři ve společnosti Inmite

•“perform one task and perform it well”

•open source

Agenda•rychlý základ

•knihovny pro vývoj

•UI, Networking, Image loaders, DI a další

•testování

•Inmite knihovny

Rychlý základ

•ActionBarSherlock

•NineOldAndroids

•Support library

•Google Play Services

UI

•Drawer (side menu)

•Page indikátory

•Number pickers

UI - Drawer

•SlidingMenu

•android-menudrawer

•DrawerLayout

SlidingMenu

•dobře konfigurovatelné

•levé i pravé side menu

•demo aplikace v Google Play

•není podle nových guidelines

android-menudrawer

•levé i pravé menu

•umí také bottom a top menu

•z nových guidelines umí pouze ikonu navigation draweru

DrawerLayout

•support library v4, revize 13

•přesně podle guidelines

•s ActionBarSherlockem nefunguje navigation drawer icon

UI - Page indikátory•ViewPagerIndicator

•časem prověřená

•PagerSlidingTabStrip

•Google Play Tabs

•Support library

•title strip & tab strip

UI - Number pickery

•android-betterpickers

•android-numberpicker

Networking na Androidu•Android má dva vestavěné HTTP

clienty

•Apache HttpClient

•lepší volba na Androidu < 2.3

•HttpUrlConnection

•lepší volba na Androidu >= 2.3

Networking

•OkHttp

•Volley

•Protocol Buffers, Protoparser

•REST - Retrofit

OkHttp•založený na HttpUrlConnection

•Android >= 2.2

•SPDY

•gzip

•response caching

•zotaveni z chyb, connection pooling

OkHttp•lze použít bez přepsání stávajícího

kódu

•implementuje HttpUrlConnection API

•volitelný balík implementuje část Apache HttpClient API

•lze použít i jako transport vrstvu

OkHttpOkHttpClient client = new OkHttpClient();

String post(URL url, byte[] body) throws IOException {

HttpURLConnection connection = client.open(url);

OutputStream out = null;

try {

connection.setRequestMethod("POST");

out = connection.getOutputStream();

out.write(body);

if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {

return "OK";

}

} finally { if (out != null) out.close(); }

}

Retrofit•REST client pro Anroid a Javu

•jednoduchá deklarace RESTového API

•podporuje GET, POST, PUT, DELETE, HEAD

•podporuje form encoded i multipart data

Retrofit

•EXAMPLE

JSON (de)serializace

•GSON - jednodušší

•Jackson - rychlejší

Protocol Buffers

•definice zprávy v samostatném souboru (.proto)

•kompiler vytvoří třídy ve zvoleném jazyce, které reprezentují obsah zprávy

•sdílené mezi serverem a klientem

Protocol Buffersmessage User {

required sint64 objectId = 1;

optional string firstName = 2;

optional string lastName = 3;

required string email = 4;

}

Image loadery

•Android-Universal-Image-Loader

•Picasso

•Volley

Android-Universal-Image-Loader

•výborně konfigurovatelný

•memory a disk cache

•podpora pro HttpUrlConnection i HttpClient

•nijak explicitně nepracuje s HttpResponseCache

Picasso•velice snadno se používá

•využívá memory a disk cache (HttpResponseCache)

•umí placeholdery, error drawably

•transformace obrázků

•využívá OkHttp nebo HttpUrlConnection

Picasso

Picasso.with(context)

.load(url)

.into(view);

Dependency injection•univerzální pattern, v zásadě netřeba

knihoven

• testování

• JSR 330

•RoboGuice & Dagger

DI - RoboGuice (google-guice)

•reflexe

•graf objektů se vytváří při startu

•řádově stovky ms pro hello world

•musí naloadovat všechny classy

DI - RoboGuice•kromě DI přináší spoustu android

specific featur

•např. @InjectView, @InjectResource

•activty a fragmenty musí dědit od Robo tříd

DI - Dagger•využívá anotační procesor ke

generování kódu

•compile-time validace

•zanedbatelný overhead

DI - Dagger

•EXAMPLE

Obecné

•Butterknife

•Guava

•Otto Event Bus

Butterknife

•knihovna pro View injection

•odstraňuje boilerplate při práci s views

•využívá generovaný kód

•v IDE zapnout anotační procesor

Butterknife@InjectView(R.id.btn) Button vBtn;

@InjectView(R.id.txt_content) TextView vContent;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Views.inject(this);

...

}

Guava

•Google's core Java libraries

•široké spektrum funkcionalit

•kolekce, caching, strings, IO, ...

Otto Event Bus• umožňuje komunikace mezi moduly, které mohou

zůstat oddělenymBus.post(new LogOutEvent(LogOutEvent.TIMEOUT));...

@Subscribepublic void didLogOut(LogOutEvent event) {

Toast.makeText(this, R.string.logout, Toast.LENGTH_SHORT).show();

}

Testování

•unit testy

•UI testování

Unit testy

java.lang.RuntimeException: Stub!

Unit testy - Android SDK•Android JUnit extension + Mock

objekty

•přinejmenším nepohodlné

•dlouhé buildění a nahrávání do zařízení

•omezený testovací framework

Unit testy - Robolectric 2.0•testování androidí aplikace bez

zařízení/emulátoru

•standardní JUnit 4 testy v JVM na počítači

•android třídy jsou zastíněny vlastní

FEST Android•přinaší asserty specifické pro Android

assertThat(listAdapter)

.isNotNull()

.hasCount(10)

.hasViewTypeCount(2);

Robolectric+FEST Android = WIN

•zcela nový level unit testů na androidu

•snadno se píší a rychle spouští

Robolectric+FEST Android = WIN

•EXAMPLE

android-styled dialogs

Díky

•Otázky?