užitečné android knihovny pro vývoj a testování
DESCRIPTION
Prezentace s konference mDevCamp 2013 o Android knihovnáchTRANSCRIPT
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
Inmite knihovny
•android-styled-dialogs
•https://github.com/inmite/android-styled-dialogs
android-styled dialogs
Díky
•Otázky?
Odkazy• http://actionbarsherlock.com/
• http://nineoldandroids.com/
• https://github.com/jfeinstein10/SlidingMenu
• https://github.com/SimonVT/android-menudrawer
• http://developer.android.com/training/implementing-navigation/nav-drawer.html
• http://viewpagerindicator.com/
• https://github.com/astuetz/PagerSlidingTabStrip
• https://github.com/derekbrameyer/android-betterpickers
• https://github.com/SimonVT/android-numberpicker
Odkazy• http://square.github.io
• https://gist.github.com/JakeWharton/5616899
• https://github.com/nostra13/Android-Universal-Image-Loader
• http://jakewharton.github.io/butterknife/
• https://code.google.com/p/guava-libraries/
• http://robolectric.org/