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
83
Writing A Plugin for Android Studio
larchaon
1
87
Marvel of Annotation Processing in Java Mobius 2017
larchaon
0
120
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
84
Testing RESTful services: GoT JavaDay Kiev Edition
larchaon
0
64
Automate the Mobile
larchaon
0
180
Google I/O 2016 Retrospective
larchaon
0
77
Other Decks in Programming
See All in Programming
Pydantic x Database API:turu-pyの開発
yassun7010
1
480
The Efficiency Paradox and How to Save Yourself and the World
hollycummins
0
140
コードレビューと私の過去と未来
jxmtst
0
180
型付きで行うVSCode拡張機能開発 / VSCode Meetup #31
mazrean
0
230
為醫療加裝Python的引擎
cclai999
0
270
M5Stack に色々な M5ユニットをつないで扱う為の新たなアプローチ
gob
0
200
全方位強化 Python 服務可觀測性:以 FastAPI 和 Grafana Stack 為例
blueswen
1
360
Kotlin Multiplatform at Stable and Beyond (Kotlin Vienna, October 2024)
zsmb
2
330
tsconfig.jsonの最近の新機能 ファイルパス編
uhyo
6
1.4k
ACES Meet におけるリリース作業改善の取り組み
fukucheee
0
120
Compose Multiplatform과 Ktor로 플랫폼의 경계를 넘어보자
kwakeuijin
0
230
上手に付き合うコンポーネントテスト
quramy
3
1.2k
Featured
See All Featured
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
37
1.7k
In The Pink: A Labor of Love
frogandcode
139
22k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
29
1.7k
Become a Pro
speakerdeck
PRO
24
4.9k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.2k
Statistics for Hackers
jakevdp
796
220k
Navigating Team Friction
lara
183
14k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
26
1.9k
ParisWeb 2013: Learning to Love: Crash Course in Emotional UX Design
dotmariusz
109
6.9k
A Philosophy of Restraint
colly
202
16k
VelocityConf: Rendering Performance Case Studies
addyosmani
324
23k
Visualization
eitanlees
143
15k
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); }