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
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
77
はじめてのぐーぐるあいおー
superdry
0
160
Other Decks in Technology
See All in Technology
オートロックマンションなのに、各部屋は施錠なし!? 攻撃者が組織内ネットワークで大暴れする理由 / The Front Door Is Locked, but the Rooms Are Wide Open: Why Attackers Move Freely Inside Enterprise Networks
nttcom
1
1.7k
【CEDEC2026】コードレビュー支援ツール開発から学ぶ:LLMを用いた業務システムの実践的な運用設計と誤出力対策
cygames
PRO
0
740
名刺メーカーDevグループ 紹介資料
sansan33
PRO
0
1.2k
クラウドセキュリティ入門 ~安全なクラウド利用のための基礎知識~
lhazy
13
8.7k
サイバー捜査員研修(前半)
nomizone
1
2k
社内の7割が使うデータ基盤を、 データチーム2人で回すためにやったこと
koh_yoshi
4
1.3k
強化学習「理論」入門
enakai00
3
3.6k
【CEDEC2026】専門性の高いデフォルメチームが挑んだ人材育成戦略 〜Cygames Academiaの企画から実施まで〜
cygames
PRO
0
600
その“隠したつもり”が命取り ── 自前と平文をやめて「正解」に委ねる
kuroneko13
0
120
DatadogのBits Chatが開発組織にもたらしたもの / What Bits Chat Has Brought Us
sms_tech
1
260
AWS ネットワーク構築でハマった(ハマりかけた) 5選とそこから得た教訓
nagisa53
4
210
SmartHR Engineering Team Deck
smarthr
1
2.1k
Featured
See All Featured
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
200
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
230
It's Worth the Effort
3n
188
29k
Odyssey Design
rkendrick25
PRO
2
750
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6k
Faster Mobile Websites
deanohume
310
32k
Paper Plane
katiecoart
PRO
2
53k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
460
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
890
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
73
41k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
280
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
420
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?
͓͠·͍ ΤϯδχΞืूதʂ