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
54
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
90
Writing A Plugin for Android Studio
larchaon
1
97
Marvel of Annotation Processing in Java Mobius 2017
larchaon
0
140
How to Become a Successful Programmer
larchaon
0
110
Kotlin JS: Is it a Thing?
larchaon
0
200
Marvel of Annotations in Java/Android
larchaon
0
110
Testing RESTful services: GoT JavaDay Kiev Edition
larchaon
0
89
Automate the Mobile
larchaon
0
190
Google I/O 2016 Retrospective
larchaon
0
79
Other Decks in Programming
See All in Programming
TROCCO×dbtで実現する人にもAIにもやさしいデータ基盤
nealle
0
340
The State of Fluid (2025)
s2b
0
200
ワープロって実は計算機で
pepepper
2
1.4k
DockerからECSへ 〜 AWSの海に出る前に知っておきたいこと 〜
ota1022
5
1.8k
パッケージ設計の黒魔術/Kyoto.go#63
lufia
1
120
Honoアップデート 2025年夏
yusukebe
1
860
ソフトウェアテスト徹底指南書の紹介
goyoki
1
110
【第4回】関東Kaggler会「Kaggleは執筆に役立つ」
mipypf
0
890
ライブ配信サービスの インフラのジレンマ -マルチクラウドに至ったワケ-
mirrativ
2
270
私の後悔をAWS DMSで解決した話
hiramax
4
150
LLMOpsのパフォーマンスを支える技術と現場で実践した改善
po3rin
8
990
Google I/O recap web編 大分Web祭り2025
kponda
0
2.9k
Featured
See All Featured
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
Music & Morning Musume
bryan
46
6.8k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
161
15k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
30
9.6k
Designing for Performance
lara
610
69k
YesSQL, Process and Tooling at Scale
rocio
173
14k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Building Applications with DynamoDB
mza
96
6.6k
Become a Pro
speakerdeck
PRO
29
5.5k
Six Lessons from altMBA
skipperchong
28
4k
The Pragmatic Product Professional
lauravandoore
36
6.8k
Scaling GitHub
holman
462
140k
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); }