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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Alexey Buzdin
February 19, 2015
Programming
76
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Choosing Right!
How an Android library can fix your needs.
Alexey Buzdin
February 19, 2015
More Decks by Alexey Buzdin
See All by Alexey Buzdin
Make you Gadget Talk: Google Assistant
larchaon
0
110
Writing A Plugin for Android Studio
larchaon
1
120
Marvel of Annotation Processing in Java Mobius 2017
larchaon
0
180
How to Become a Successful Programmer
larchaon
0
120
Kotlin JS: Is it a Thing?
larchaon
0
210
Marvel of Annotations in Java/Android
larchaon
0
130
Testing RESTful services: GoT JavaDay Kiev Edition
larchaon
0
130
Automate the Mobile
larchaon
0
230
Google I/O 2016 Retrospective
larchaon
0
89
Other Decks in Programming
See All in Programming
霧の中の代数的エフェクト
funnyycat
1
370
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
360k
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
210
Snowflake Summitでの新機能 CoCo / CoWork / snowflake-summit-2026-overall-what-new-coco
tatsuhiro
1
220
【やさしく解説 設計編 #1】「ドメイン駆動」と「実装駆動」ってなに? 〜設計の考え方を、たとえ話で学ぼう〜
panda728
PRO
1
120
ソフトウェア設計に溶けるインフラ ― AWS CDK のインフラ認識論
konokenj
2
370
JAWS-UG横浜 #102 AWSサ終供養LT会 成仏できない AWS サービスたち 〜本日、三体供養します〜
maroon1st
0
160
1B+ /day規模のログを管理する技術
broadleaf
0
140
初めてのKubernetes 本番運用でハマった話
oku053
0
120
はてなアカウント基盤 State of the Union
cockscomb
1
1.3k
Claude Team Plan導入・ガイド
tk3fftk
0
190
琵琶湖の水は止められてもNet--HTTPのリトライは止められない / You might be able to stop the water flow of Lake Biwa but you can't stop Net::HTTP retries
luccafort
PRO
0
320
Featured
See All Featured
A Soul's Torment
seathinner
6
3.1k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
220
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
Google's AI Overviews - The New Search
badams
0
1.1k
ラッコキーワード サービス紹介資料
rakko
1
3.9M
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
Producing Creativity
orderedlist
PRO
348
40k
A Tale of Four Properties
chriscoyier
163
24k
Unsuck your backbone
ammeep
672
58k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
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); }