Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
tab for Androidの作り方
Search
lychee
April 24, 2014
Technology
400
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
tab for Androidの作り方
lychee
April 24, 2014
More Decks by lychee
See All by lychee
Android開発者とデザイナーの効果的な連携に効く話
superdry
0
78
はじめてのぐーぐるあいおー
superdry
0
160
Other Decks in Technology
See All in Technology
「大丈夫そう?」をObservabilityで確かめる
mrmtsu
0
190
PQC移行の今 -- IETF からみた現在地
satokan
4
490
認知負荷を吸収し、プロダクトをまたぐPR Preview基盤の設計事例
taiki45
2
430
Kiro Meetup #8 Kiro アップデート (2026/3/21〜2026/9/24)
katzueno
1
280
CI/CDではもう遅い - 人とAIが迂回しないDevSecOps Verify基盤の再設計 -
kintotechdev
1
330
AIは推し活である。
kurazuuuuuu
2
990
「今盗んで、後で解く」に備える ― AWSのポスト量子暗号入門
yama3133
2
250
【ゲームメーカーズスクランブル2026】『Shadowverse: Worlds Beyond』UIとアニメーションで実現する最高のユーザー体験を叶えるプロトタイピング
cygames
PRO
1
610
C#コードの結合を可視化する Roslyn解析による設計改善と リファクタリング判断
dora56
0
830
Account Factory for Terraformによる 標準化されたアカウント発行の自動化
pensuke628
0
110
SREへの勘違いに気づいた後の話
tomodakengo
0
170
Antigravity SDK for the Java Developer
glaforge
0
210
Featured
See All Featured
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
5
740
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
460
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
700
WENDY [Excerpt]
tessaabrams
14
39k
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.2k
30 Presentation Tips
portentint
PRO
1
410
Crafting Experiences
bethany
1
350
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.8k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
520
ラッコキーワード サービス紹介資料
rakko
1
5M
Deep Space Network (abreviated)
tonyrice
0
320
Transcript
tab for Androidͷ࡞Γํ Yasuyo Nishioka (tab Inc.) 2013/4/24
tab for Android • 2013/2 ։ൃ։࢝ • ݱࡏ1.9.3൛ • ։ൃମ੍2໊
• ϦϦʔε݄2ʙ4ϖʔε • ରԠൣғɿAPI Ϩϕϧ 10(2.3.3)Ҏ্ • ࡉʑͱͬͯ·͢ ΤϯδχΞืूதʂ
ࠓ͢͜ͱ • ։ൃπʔϧ • ΞϓϦͷߏͱ༻ϥ ΠϒϥϦ • API௨৴෦ • JSONύʔα
• Model • ը໘දࣔ • ͦͷଞϥΠϒϥϦ • ςετ
։ൃπʔϧ
։ൃπʔϧ • IDE • Eclipse • Android StudioʹҠ ߦத •
ϦϙδτϦ • GitHub Enterprise • CI • Jenkins @AWS • ࣾςετ • DeployGate
πʔϧͷ࿈ܞ ᶃpush ᶄpull ᶅbuild ᶆupload ᶇdownload ᶈdogfooding
ͦͷଞπʔϧ • A/Bςετ • Apptimize • Ҋ݅ཧ • Pivotal Tracker
• όάཧ • Bugsense • ίϛϡχέʔγϣϯ • Hipchat
Apptimize
Pivotal tracker
Bugsense
Hipchat Bugsense Pivotal Jenkins Github ͱ࿈ܞ
ΞϓϦͷߏͱ༻ϥΠϒϥϦ
"1*௨৴෦ • ϥΠϒϥϦ:Android Async Http Client • ࣌Volley͕ͳ͔ͬͨ • ը૾μϯϩʔυܥAPI͔ͭͬͯͳ͍
(ޙड़) • AsyncHttpResponseHandleΛ֦ு͠REST APIίʔϧ͔ΒJSONύʔεͯ͠ModelΦϒ δΣΫτͱͯ͠อ࣋͢Δ·ͰҰ؏ͰΕΔ Α͏ʹ͍ͯ͠Δɻ
ʢྫʣ"1*௨৴෦ public static void get(int id, final OnPostListener<ItemObject> listener) {
String pathString = String.format("items/%d.json", id); tabRestClient.execute( pathString, null, new TabApiResponseHandler<ItemObject>(listener)); }
ྫʣσʔλऔಘ Item.get(itemId, new OnPostListener<ItemObject>() { @Override public void onError(Throwable e,
Error error) { //Τϥʔॲཧ } @Override public void onCompletion(ItemObject response) { Item item = response.getItem(); // Α͠ͳʹ } });
Model • ϥΠϒϥϦ:Lombok • ίʔυྔݮ • BundleʹͭΊΕΔΑ͏ʹSerializableΛܧঝ • ઌ΄Ͳͷσʔλऔಘͷॲཧ͜ͷΫϥεʹ ࣮
ίʔυྔͷൺֱ import lombok.Data; @Data public class Item implements Serializable {
public static final String KEY = "item"; /** Response */ private int id; private String title; private String description; public static void get(int id, hogehoge...){ //͖ͬ͞ͷίʔυ } } public class Item implements Serializable { public static final String KEY = "item"; /** Response */ private int id = Models.INVALID_INT; private String title; private String description; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public static void get(int id, hogehoge...) { //͖ͬ͞ͷίʔυ } }
JSONύʔα • ϥΠϒϥϦ: Jackson • Jackson/GSON/JSONIC Ͱϕϯνͱ ͬͯൺֱ • ඇಉظॲཧ͢ΔΑ͏֦ு
ը໘දࣔ ྫ1) ͲΜͲΜͰͯ͘ΔΑ ϖʔδωʔγϣ ϯɾϓϦϩʔυ 2ྻදࣔ Pull to Refresh
Loader/Adapter • LoaderࣗಈͰϖʔδωʔγϣϯ͢ΔΑ͏֦ு • AdapterϓϦϩʔυΛ͢ΔΑ͏֦ு • GenericsͰڞ௨Խ
Loader/Adapter <<abstract>> BaseAdapter <<abstract>> AbstractLoaderAdapter CustomAdapter CustomPairLayout Adapter <<abstract>> AbstractDataLoader
<<interface>> DataLoader CustomLoader Activity, Fragment <<create>> <<create>> <<interface>> DataLoaderListener
ʢྫʣLoader public class ItemLoader extends AbstractDataLoader<Item> { @Override protected void
onLoadPage(int page, int limit, OnPostListener<? extends PaginatedResponse<Item>> listener) { Item.list(page, limit, (OnPostListener<PaginatedItems>) listener); } }
ʢྫʣAdapter public class ItemAdapter extends AbstractLoaderAdapter<ItemLoader> { public ItemAdapter(ItemLoader loader,
Context context) { super(loader, context); reload(); } @Override public View getView(int position, View convertView, ViewGroup parent) { // Α͠ͳʹ } }
Pull to refresh ListView • ༻ϥΠϒϥϦ: Pull to Refresh
ListView • ࣌ActionBar-PullToRefresh SwipeRefreshLayoutͳ͔ͬͨ • ܰྔ • GridView͕͑ͳ͍ • ͋·Γϝϯςφϯε͞Εͯͳ͍ͷͰɺҰ෦ SwipeRefreshLayoutʹҠߦத • ϑολʔʹϩʔσΟϯάΞχϝʔγϣϯΛදࣔ͢ ΔΑ͏֦ு
ը૾μϯϩʔυ • ༻ϥΠϒϥϦ: Universal Image Loader • ࠷ॳSmartImageViewΛ͍͕ͬͯͨɺͪ͜ Βͷํ͕ɺΦϓγϣϯ͕๛(σΟϨΠදࣔɺ ؙ֯ɺΩϟογϡͳͲ)ͰΧελϜ͍͢͠
• inMemory/onDiskͰΩϟογϡ • ؙ֯ॏ͍ͷͰ֎ͨ͠
ը໘දࣔ ྫ2) ·ͩ·ͩ͋ΔΑ ɹػೳ͕Γͩ͘͞Μ ฤूɺআɺίϐʔɺҠಈɺڞ༗ɺ tabாϑΥϩʔɺ༧ɺϦΫϦοϓɺಛయද ࣔɺใදࣔɺళฮใදࣔɺϚοϓɾϧʔ τݕࡧɺ ผΞΠςϜͷαδΣετɺϦΫϦοϓҰ ཡɺίϝϯτ…
• ॳ1Fragment͕ͩͬͨlistenerͩΒ͚ ʹͳͬͯ͠·͍ϝϯςφϯε͕ࠔʹ • Nested Fragmentʹ͏͜Γ͝Γ • Event busΛ͏͜ͱʹ
Event Bus • ༻ϥΠϒϥϦɿSquare Otto • Activity-Fragmentؒɺ֤Fragmentؒͷ௨ʹ༻ • Fragmentͷָׂ͕ʹˍListenerࠈ͔Βղ์ •
Weak Reference ͬͯunregister͠ͳ͍͍ͯ͘Α͏ʹ ֦ு
ͦͷଞ༻ϥΠϒϥϦ • Android-ViewPagerIndicator • Android-MenuDrawer • ArcMenu/SwitchCompatLibrary • Google Play
Service • GridLayout • Facebook SDK • Twitter4j • OrmLite ... ଟ͗ͯ͢ɺ ϝιου্ݶʹ Ҿ͔͔ͬΔ
ϝιου্ݶ • ݱ • ಛఆͷ2.3ܥͰىಈͰ͖ͳ͍ • Error while installing application
(INSTALL_FAILED_DEXOPT) • ݪҼ • ϝιου͕65536Ҏ্ʹͳΔͱDexoptͷ ͏όοϑΝαΠζΛ͑Δ
ରॲ • ϥΠϒϥϦΛεϦϜʹ • ͋·Γͬͯͳ͔ͬͨGuavaΛ֎͢ • GooglePlayServicesͱAnalyticsͷϥΠϒϥϦ Λซ༻͠ͳ͍ • ຊདྷ...
• ProGuardͰ࠷దԽ • dexϑΝΠϧΛׂ͠ΧελϜΫϥεϩʔσΟ ϯά • Facebookϒϩάͱ͔
ςετ
ςετ • ༻ϥΠϒϥϦɿMockito + Roboguice • ςετϙϦγʔ • ௨৴෦ɾModelɾLoaderςετඞਢ •
API௨৴෦Λmock/spyͯ͠ਖ਼ৗ/ҟৗܥ Ұ௨Γ
՝ • γφϦΦςετΛ͍ͨ͠ • RobotiumΛͬͯγφϦΦςετ࣮͠ ͕ͨɺ҆ఆ͠ͳ͍ҝ͍ͣͯ͠Δ • Espresso? • final/staticϝιουͰϞοΫͰ͖ͳ͍
• PowerMock?
͓͠·͍ ΤϯδχΞืूதʂ