Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Choosing Right!
Search
Alexey Buzdin
February 19, 2015
Programming
0
52
Choosing Right!
How an Android library can fix your needs.
Alexey Buzdin
February 19, 2015
Tweet
Share
More Decks by Alexey Buzdin
See All by Alexey Buzdin
Make you Gadget Talk: Google Assistant
larchaon
0
85
Writing A Plugin for Android Studio
larchaon
1
91
Marvel of Annotation Processing in Java Mobius 2017
larchaon
0
130
How to Become a Successful Programmer
larchaon
0
100
Kotlin JS: Is it a Thing?
larchaon
0
190
Marvel of Annotations in Java/Android
larchaon
0
90
Testing RESTful services: GoT JavaDay Kiev Edition
larchaon
0
69
Automate the Mobile
larchaon
0
180
Google I/O 2016 Retrospective
larchaon
0
77
Other Decks in Programming
See All in Programming
PHPで学ぶプログラミングの教訓 / Lessons in Programming Learned through PHP
nrslib
4
1k
開発者とQAの越境で自動テストが増える開発プロセスを実現する
92thunder
1
220
선언형 UI에서의 상태관리
l2hyunwoo
0
250
責務を分離するための例外設計 - PHPカンファレンス 2024
kajitack
9
2.3k
Cloudflare MCP ServerでClaude Desktop からWeb APIを構築
kutakutat
1
630
traP の部内 ISUCON とそれを支えるポータル / PISCON Portal
ikura_hamu
0
140
技術的負債と向き合うカイゼン活動を1年続けて分かった "持続可能" なプロダクト開発
yuichiro_serita
0
270
快速入門可觀測性
blueswen
0
480
Fixstars高速化コンテスト2024準優勝解法
eijirou
0
170
サーバーゆる勉強会 DBMS の仕組み編
kj455
1
200
テストケースの名前はどうつけるべきか?
orgachem
PRO
1
180
今年のアップデートで振り返るCDKセキュリティのシフトレフト/2024-cdk-security-shift-left
tomoki10
0
330
Featured
See All Featured
Designing for Performance
lara
604
68k
Building Your Own Lightsaber
phodgson
104
6.2k
Building Flexible Design Systems
yeseniaperezcruz
328
38k
Practical Orchestrator
shlominoach
186
10k
Rails Girls Zürich Keynote
gr2m
94
13k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
GraphQLの誤解/rethinking-graphql
sonatard
68
10k
jQuery: Nuts, Bolts and Bling
dougneiner
62
7.6k
Making the Leap to Tech Lead
cromwellryan
133
9k
A Tale of Four Properties
chriscoyier
157
23k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
330
21k
Building Better People: How to give real-time feedback that sticks.
wjessup
366
19k
Transcript
Choosing Right! How an Android library can fix your needs
Alexey Buzdin
ORMs - Fast
ORMs - Fast - Supports Cursor
Cursor new FlowCursorList<>(true, TestModel.class, Condition.column(TestModel$Table.NAME) .like("pasta%")); on getItem -> move
Cursor
ORMs - Fast - Supports Cursor - Supports Migration
ORMs - Fast - Supports Cursor - Supports Migration -
Supports Query Syntax
Query Syntax new Select().from(Item.class) .orderBy(“RANDOM()") .executeSingle();
ORMs Bonus points - Model Callbacks
Model Callbacks @Override protected void beforeSave() { updatedAt = System.currentTimeMillis();
} @Override protected void afterDelete() { // clean up some things? }
ORMs Bonus points - Supports Relations - Model Callbacks
ORMs Bonus points - Supports Relations - Model Callbacks -
Supports Custom Converters - Supports Transactions
ORMs Bonus points - Supports Relations - Model Callbacks -
Supports Custom Converters - Supports Transactions
DBFlow https://github.com/Raizlabs/DBFlow ActiveAndroid ORMLite Ollie https://github.com/pardom/ActiveAndroid https://github.com/pardom/Ollie https://github.com/j256/ormlite-android https://github.com/emilsjolander/sprinkles Sprinkles
Images - Image transformations - ImageView recycling - Automatic memory
and disk caching
Images https://github.com/loopj/android-smart-image-view https://github.com/square/picasso
Dependency Injection - Fast - No boilerplate - Minimum configuration
- Support scopes and providers - Android system services in scope
Dependency Injection https://github.com/google/dagger https://github.com/roboguice/roboguice https://github.com/square/dagger RoboGuice 3.0 Dagger Dagger 2.0
RoboGuice Defaults https://github.com/roboguice/roboguice/blob/master/ roboguice/src/main/java/roboguice/config/ DefaultRoboModule.java
Dagger
Dagger 2.0
Resource Injection - View injection - Resource injection - Listeners
injection
InjectViews class ExampleActivity extends Activity { @InjectView(R.id.title) TextView title; @InjectView(R.id.subtitle)
TextView subtitle; @InjectView(R.id.footer) TextView footer; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.simple_activity); ButterKnife.inject(this); // TODO Use "injected" views... } }
InjectView Holder static class ViewHolder { @InjectView(R.id.title) TextView name; @InjectView(R.id.job_title)
TextView jobTitle; public ViewHolder(View view) { ButterKnife.inject(this, view); } }
Listeners @OnClick(R.id.submit) public void submit(View view) { // TODO submit
data to server... } @OnItemSelected(R.id.list_view) void onItemSelected(int position) { // TODO ... }
Inject Resource public class MyActivity extends RoboActivity { @InjectResource(R.anim.my_animation) Animation
myAnimation; @InjectResource(R.string.app_name) String appName; // the rest of your code }
Resource Injection RoboGuice 3.0 https://github.com/roboguice/roboguice ButterKnife https://github.com/JakeWharton/butterknife AndroidAnnotations https://github.com/excilys/androidannotations
REST - Multipart request body and file upload - Support
URL param and query param - Support JSON, XML - Header Manipulation
REST https://github.com/square/retrofit Retrofit AndroidAnnotations https://github.com/excilys/androidannotations
AndroidAnnotations @Rest("http://www.bookmarks.com") public interface BookmarkClient { @Get("/bookmarks/{userId}?search={search}") Bookmarks getBookmarks(String search,
String userId); } ……. @RestService BookmarkClient restClient; …….
Retrofit RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint("https://api.github.com") .build(); GitHubService service
= restAdapter.create(GitHubService.class); public interface GitHubService { @GET("/users/{user}/repos") List<Repo> listRepos(@Path("user") String user); }
HTTP http://loopj.com/android-async-http/ Android Async Http https://github.com/square/okhttp OK-Http
Tests https://github.com/square/assertj-android https://github.com/robolectric/robolectric https://github.com/RobotiumTech/robotium https://code.google.com/p/android-test-kit/wiki/Espresso AssertJ Robolectric Espresso Robotium
Robotium public void testPreferenceIsSaved() throws Exception { Solo solo =
new Solo(getInstrumentation(), getActivity()); solo.clickOnText("txt"); solo.clearEditText(2); solo.enterText(2, "robotium"); solo.clickOnButton("Save"); solo.goBack(); solo.clickOnText("Edit File Extensions"); assertTrue(solo.searchText(“application/robotium")); } } public class EditorTest extends ActivityInstrumentationTestCase2<EditorActivity> {
Robolectric @RunWith(RobolectricTestRunner.class) public class MyActivityTest { @Test public void clickingButton_shouldChangeResultsViewText()
throws Exception { Activity activity = Robolectric.buildActivity(MyActivity.class).create().get(); Button pressMeButton = (Button) activity.findViewById(R.id.press_me_button); TextView results = (TextView) activity.findViewById(R.id.results_text_view); pressMeButton.performClick(); String resultsText = results.getText().toString(); assertThat(resultsText, equalTo("Testing Android Rocks!")); } }
AssertJ assertThat(layout).isVisible() .isVertical() .hasChildCount(4) .hasShowDividers(SHOW_DIVIDERS_MIDDLE); assertThat(view).isGone();
Validation https://github.com/inmite/android-validation-komensky https://github.com/ragunathjawahar/android-saripaar Android Validation Komensky Android Saripaar
Android Saripaar @NotEmpty @Email private EditText emailEditText; @Password(min = 6,
scheme = Password.Scheme.ALPHA_NUMERIC_MIXED_CASE_SYMBOLS) private EditText passwordEditText; @ConfirmPassword private EditText confirmPasswordEditText; @Checked(message = "You must agree to the terms.") private CheckBox iAgreeCheckBox; new Validator(this).validate();
Android Validation Komensky @NotEmpty(messageId = R.string.validation_name) @MinLength(value = 3, messageId
= R.string.validation_name_length, order = 2) private EditText mNameEditText; FormValidator.validate(this, new SimpleErrorPopupCallback(this));
Misc Pidcat https://github.com/square/otto Otto https://github.com/JakeWharton/pidcat https://github.com/avast/android-butterknife-zelezny Android Butterknife Zelezny
Pidcat
Android Butterknife Zelezny
Otto Bus bus = new Bus(); bus.post(new AnswerAvailableEvent(42)); @Subscribe public
void answerAvailable(AnswerAvailableEvent event) { // TODO: React to the event somehow! } bus.register(this); @Produce public AnswerAvailableEvent produceAnswer() { // Assuming 'lastAnswer' exists. return new AnswerAvailableEvent(this.lastAnswer); }