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
droidkaigi2016
Search
funnelbit
February 18, 2016
Technology
8.5k
7
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
droidkaigi2016
funnelbit
February 18, 2016
More Decks by funnelbit
See All by funnelbit
Hatena Engineer Seminar #9
funnelbit
5
7.5k
droidkaigi-2017-renovation
funnelbit
10
11k
Dart
funnelbit
0
300
BottomBarAndSnackBar
funnelbit
0
550
Dagger2 Optional bindings
funnelbit
0
620
WearableRecyclerView
funnelbit
1
850
QucikSettingsTileAPI
funnelbit
0
390
Mobile Vision
funnelbit
0
490
AwarenessAPI
funnelbit
0
170
Other Decks in Technology
See All in Technology
あけおめLINE 傾向とその対策
nasa9084
0
290
JSONataとAWS Step Functionsで目指すRuntimelessな世界
mu7889yoon
0
440
aws-iot-platform-architecture-use-cases.pdf
ma2shita
0
530
え、こんなに早く改修できるの?──新人エンジニアとスクラムマスターの2人が語る、AI×アジャイル開発の現場
ysasago
2
670
Oracle Cloud Infrastructure(OCI):Onboarding Session(はじめてのOCI/Oracle Supportご利⽤ガイド)
oracle4engineer
PRO
2
20k
絵ではじめるKubernetesセキュリティ
aoi1
4
700
Making AI Agents Safe and Fast- Jev, Obsidian, and the Meta-Harness
x5gtrn
PRO
0
120
What the customer really needed
kawaguti
PRO
3
220
Oracle Cloud Network Path Analyzerを試してみた/I Tried Out Oracle Cloud Network Path Analyzer
masakiokuda
1
110
銀行勘定系システムにおける開発プロセス刷新×AIによる環境モダナイゼーション / Development Process Transformation and AI-Driven Environment Modernization
muit
1
2.6k
現場で役立つ技術負債の効果的な返済方法
masuda220
PRO
11
5.1k
「ピッケル本」日本語版は4.0(第6版)が出版されるべき / pickaxe4-nagoyark05
kakutani
2
280
Featured
See All Featured
Docker and Python
trallard
47
4.2k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
440
GitHub's CSS Performance
jonrohan
1033
470k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
550
Testing 201, or: Great Expectations
jmmastey
46
8.3k
30 Presentation Tips
portentint
PRO
1
400
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
250
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
700
Prompt Engineering for Job Search
mfonobong
0
460
Rails Girls Zürich Keynote
gr2m
96
14k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
710
Optimising Largest Contentful Paint
csswizardry
37
4k
Transcript
%BHHFSͱ3FBMNΛ ར༻ͨ͠Ϟμϯͳ։ൃ ଜɹྋ
ࣗݾհ w ଜɹྋ w ͯͳJEGVOOFMCJU w 5XJUUFSJEFYQFSPQFSP
None
ͯͳϒοΫϚʔΫ
ژ
ࠓ͢͜ͱ w ϑϨʔϜϫʔΫ͔ΒϩδοΫΛΓ͢ w ӬଓԽ w αʔόαΠυͱฒߦͨ͠։ൃ w ϓϩμΫτνΣοΫ
ϑϨʔϜϫʔΫ͔Βϩ δοΫΛΓ͢
ϑϨʔϜϫʔΫ w "OESPJE4%,͕ఏڙ͢ΔɺΞϓϦը໘ͷϥΠ ϑαΠΫϧͱڧ݁͘ͼ͍ͭͨΫϥε
ϩδοΫΛͲ͜ʹॻ͔͘ w º"DUJWJUZ 'SBHNFOUʹॻ͘ w ංେԽɺςετෆՄೳ w ˛$VTUPN7JFXʹॻ͘ w 7JFXͷϩδοΫ͜͜ʹॻ͚ྑ͍
w ͦΕҎ֎ͷॴ
ͦΕҎ֎ͷॴʁ w ϩδοΫΛநԽͯ͠Γग़͢ w d$POUSPMMFS d.BOBHFSͳͲɺϩδοΫ୲ ΫϥεΛ࡞Δ
ϩδοΫͷநͷ*OTUBODFΛ Ͳ͜Ͱ࡞Δ͔ʁ w ˛ར༻͢Δ"DUJWJUZʹॻ͘ w ݁ͼ͖͕ͭڧ͘ͳΔ w ςετͷ࣌ʹڍಈΛม͍͑ͨͱ͖ʁ w ˓ར༻͢Δͷ֎෦Ͱੜɾཧ
w ґଘͤ͞ͳ͍ w ςετ࣌ʹΓସ͑Δɺͱ͍ͬͨ͜ͱ͕༰қ w %*
ૉͳ%* public EntryManager(APIClient apiClient) { this.mAPIClient = apiClient; ... }
ૉͳ%*͑ͳ͍ w "DUJWJUZͱ'SBHNFOUʹରͯ͠ແྗ w ίϯετϥΫλͰΠϯελϯεͤͳ͍ w 1BSDFMBCMFʹͯ͠ؤுΕͰ͖ͳ͍͜ͱͳ͍͕ ؤுΓͨ͘ͳ͍ w ͜ͷ%*ίϯςφ͕͋Εղܾ͢Δ
%*ίϯςφ w ґଘೖΛߦ͏ϑϨʔϜϫʔΫ w खಈͰΈΛ༻ҙ͠ͳͯ͘ྑ͍ w Πϯελϯεཧߦͳ͑Δ
Ͳͷ%*ίϯςφΛ͏͖ ͔ʁ w 3PCP(VJDF w %BHHFS w %BHHFS
%BHHFS
%BHHFS w IUUQTHJUIVCDPNHPPHMFEBHHFS w %*ίϯςφ w 4RVBSF͕։ൃͯͨ͠%BHHFSͷHPPHMFGPSL
%BHHFSͷར w ίϯύΠϧ࣌ʹίʔυੜ͠ґଘղܾ w ࣮ߦதͷύϑΥʔϚϯεʹӨڹ͠ͳ͍ w σόοάͰίʔυΛ͍͍͢
%*ͷߏ w .PEVMF w *OTUBODFͷੜํ๏Λهड़ w $PNQPOFOU w .PEVMFͷ*OTUBODFΛͲ͜ʹJOKFDU͢Δ͔ه ड़
w ֊ߏΛׂͨͤͯΛ୲͠໌֬Խ
.PEVMF @Module public class MainModule { ... @Provides EntryManager
provideEntryManager() { return new EntryManager(mService); } ...
$PNQPOFOU @Component(modules = MainModule.class) public interface MainComponent { void inject(MainActivity
mainActivity) …
*OKFDU public class MainActivity extends AppCompatActivity { @Inject EntryManager mEntryManager;
@Override protected void onCreate(Bundle b) { ... ((App) getApplication()) .component() .inject(this); ...
5FTU༻.PEVMF @Module public class MainTestModule { ... @Provides EntryManager
provideEntryManager() { return new EntryManager(mStubService); } ...
ςετ༻$PNQPOFOU @Component(modules = MainTestModule.class) public interface MainTestComponent { void inject(EntryManagerTestCase
testCase) …
*OKFDU ςετ public class EntryManagerTestCase extends InstrumentationTestCase { … @Inject
EntryManager mEntryManager; … public testGetEntries() { assertEquals( "ΤϯτϦऔಘͰ͖͍ͯΔ", false, mEntryManager.getEntries().isEmpty()); } }
$PNQPOFOUͷ͚ํ w "DUJWJUZ'SBHNFOUຖʹ͚Δʁ w ͕υϯυϯ૿͍͑ͯ͘ w ׂ͝ͱʹ͚Δ w ֊ߏΛ࡞ͬͯࡉԽ
4VC$PNQPOFOU @Component(modules = MainModule.class) public interface MainComponent { void inject(App
app); // Activities void inject(RootActivity rootActivity); // Fragments void inject(MainSettingsFragment mainSettingsFragment); // Subcomponents UserComponent userComponent(UserModule userModule); }
4VC$PNQPOFOU @Subcomponent(modules = UserModule.class) public interface UserComponent { //
Fragments void inject(MyFragment myFragment); UserController userController(); }
$PNQPOFOUΛऔಘ public class MyFragment extends Fragment { MainComponent mainComponent =
App.get(getActivity()) .getMainComponent(); UserComponent userComponent = mainComponent.userComponent( new UserModule( mainComponent.getRealm(), args.getString(ARGS_USER_ID))); userComponent.inject(this); }
ӬଓԽ
ӬଓԽ͢Δత w 8FC"1*͔ΒͷϨεϙϯεΛӬଓԽ w ΦϑϥΠϯ༻ͷΩϟογϡσʔλͷͨΊ w "DUJWJUZ'SBHNFOUͷ࠶ੜ࣌ʹ෮ؼ͢ΔͨΊ w ෳͷը໘Ͱಉ͡σʔλΛදࣔ͢Δͱ͖ͷҰ؏ ੑΛอͪ͘͢͢ΔͨΊ
ӬଓԽ͢Δखஈ w º4IBSFE1SFGFSFODFTʹೖΕΔ w ˛'JMFʹॻ͖ͩ͢ w ˓42-JUFʹೖΕΔ w ˓3FBMNΛ͏
42-JUF w "OESPJEඪ४ͳͷͰ҆৺ײ͕͋Δ w ࣗྗͰॻ͘ͷগʑ໘͍͘͞ w 03.͏ʁ w ͍͢͞ɺૣ͞ɺ҆ఆɺকདྷੑʜ
3FBMN w ։ൃ͕׆ൃ w 42-JUFͷΑ͏ͳ໘ͳ͜ͱΛ͠ͳͯ͘ྑ͍ w ˛όʔδϣϯະຬ
3FBMNΛ͏ w J04ΞϓϦͱ ՄೳͳݶΓ ڞ௨ͷϞσϧΛ࣋ͪͨ ͍ͨΊ w ։ൃ׆ൃ͔ͩΒԿ͔͋ͬͯରॲ͞ΕΔͰ͋Ζ ͏
3FBMN
3FBMN w 42-JUFΛஔ͖͑͏Δ.PCJMFEBUBCBTF w 03.ͷػೳ࣋ͭ w ߴ w J04Ͱར༻Մೳ
3FBMNΛ͏ new RealmConfiguration.Builder(context) .name("realm") .schemaVersion(1L) .build();
3FBMNΛ͏ RealmResults<Entry> followingEntries = mRealm.where(Entry.class) .equalTo("isFollowing",true) .findAllSortedAsync( "createdAt", Sort.DESCENDING);
"DUJWJUZੜ࣌ʹҾ͘ public class MainActivity extends AppCompatActivity { … public void
onCreate(Bundle savedInstanceState) { mRealmResults = mRealm.where().findAllAsync() … } w ͙͢͞·3FBMN3FTVMUTΛಘΔ w ਖ਼͘͠෮ݩ͢ΔͨΊʹ͏
"EBQUFSʹ3FBMN3FTVMU public class EntriesAdapter { public EntriesAdapter(RealmResults<Entry> entries) { mEntries
= entries; mRealmChangeListener = new RealmChangeListener() { @Override public void onChange() { mListItems = getItems(); EpisodesAdapter.this.notifyDataSetChanged(); } }; … } …
"EBQUFSʹ3FBMN3FTVMU public class EntriesAdapter { … @Override public void onAttachedToRecyclerView(RecyclerView
recyclerView) { super.onAttachedToRecyclerView(recyclerView); mResults.addChangeListener(mRealmChangeListener); } @Override public void onDetachedFromRecyclerView(RecyclerView recyclerView) { mResults.removeChangeListener(mRealmChangeListener); super.onDetachedFromRecyclerView(recyclerView); } …
"DUJWJUZؒͷσʔλड͚͠ Intent intent = new Intent(context, EpisodeActivity.class); intent.putExtra(EXTRA_ID, Id); w
3FBMNͷ*%Λ͢͜ͱʹͯ͠͠·͏ w ࠶ੜʹඋ͑ΕΔ͜ͱʹͳΔ
3FBMN Λ %BHHFS Ͱ εϨου͝ͱʹ*OKFDU
εϨου·ͨ͛ͳ͍ w 3FBMN*OTUBODF͕࡞͞ΕͨεϨου͔Βଞͷ εϨουͰ͑ͳ͍ w ͔͠͠*OKFDUPO$SFBUF Ͱߦ͍͍ͨ w ʮผεϨου͕ཉ͍࣌͠ʹ*OKFDU͢ΔΈʯ͕ ඞཁ
%BHHFSͷ1SPWJEFSΛ͏ … @Inject public EntryPrefetcher(Provider<Realm> realmProvider) extends ThreadPoolExecutor { mRealmProvider
= realmProvider; … private static class Task implements Callable<String> { @Override public String call() throws Exception { Realm realm = mRealmProvider.get(); … } …
αʔόαΠυ ͱ ฒߦͨ͠։ൃ
αʔόαΠυͱฒߦͨ͠։ൃ w "1*͕ඞͣ͠ઌߦ͢ΔͱݶΒͳ͍ w μϛʔσʔλΛΞϓϦ෦ʹ͔࣋ͭʁ w "1*ʹมߋ͕͋ͬͨ࣌ʹ໘ w J04ଆಉ࣌ʹมߋ͢Δඞཁ͕ग़ͯ͘Δ
4UVC4FSWFS
4UVC4FSWFS w μϛʔͷϨεϙϯεΛฦ͢αʔόΛ࡞Δ w "1*4DIFNB όϦσʔλͱͯ͠ར༻ w IUUQTHJUIVCDPNIJUPEF"1*4DIFNB
4UVC4FSWFS SFTPVSDFMPHJO@SFRVFTU\ UZQFPCKFDU EFTDSJQUJPOϩάΠϯϦΫΤετ QSPQFSUJFT\ FNBJM@BEESFTT\ UZQFTUSJOH
EFTDSJQUJPOϝʔϧΞυϨε FYBNQMFBCD!FYBNQMFDPN ^ QBTTXPSE\ UZQFTUSJOH EFTDSJQUJPObύεϫʔυ FYBNQMF1BTTXSE ^ ^ SFRVJSFE<FNBJM@BEESFTT QBTTXPSE> ^
ςετͰ4UVC4FSWFSΛ ͏ w ˛μϛʔͷ+40/Λ෦ʹ࣋ͬͯςετʹར༻ w "1*มΘΔͨͼʹมߋͤͶͳΒͳ͍ w "1*ͷมߋʹςετ͕ؾ͚ͳ͍ w ̋"1*ͷαʔόΛୟ͘
w μϛʔσʔλෆཁ w มߋʹςετ͕ؾ͕ͭ͘
ϓϩμΫτνΣοΫ
ϓϩμΫτνΣοΫ w ژɾ౦ژʹΦϑΟε͕͋Δ w ౦ژʹσβΠφʔ͕͍Δ w ख৮Γ৮Εͳ͍ͱΘ͔Βͳ͍
#FUB#Z$SBTIMZUJDT KFOLJOT GBTUMBOF
#FUB w #FUB#Z$SBTIMZUJDTΛͬͯ#FUB৴ w ৴ͷλΠϛϯάKFOLJOTʹͤΔ
KFOLJOT w ϒϥϯνΛݟͯͯɺNBTUFSʹϚʔδ͞ΕͨΒ #FUBΛඈ͢ w εΫϦʔϯγϣοτΛࡱͬͯ؆қతͳσβΠϯ֬ ೝ w "1*ຖͷࠩҟΛ֬ೝ w
4MBDLʹ௨
GBTUMBOF (JUIVC࿈ܞ EBUB\TUBUFTUBUF UBSHFU@VSMUBSHFU@VSM DPOUFYUDPOUFYU EFTDSJQUJPO^ IFBEFST\"VUIPSJ[BUJPOUPLFO\UPLFO^^ &YDPOQPTU VSM
IFBEFSTIFBEFST CPEZ EBUBUP@KTPO
GBTUMBOF 4MBDL࿈ܞ TMBDL NFTTBHFSPDLFUϏϧυ͕ྃ͠·ͨ͠SPDLFU DIBOOFMBQQ TVDDFTTUSVF
QBZMPBE\ #VJME%BUF5JNFOFXUP@T ^ EFGBVMU@QBZMPBET<HJU@CSBODI HJU@BVUIPS>
ςετ࣮ߦ EFTD3VOTBMMUIFUFTUT MBOFUFTUEP HSBEMF UBTLD$ FOE
·ͱΊ w ϑϨʔϜϫʔΫ͔ΒϩδοΫΛΓ͢ w ϩδοΫͷநԽɺ%BHHFSͰ*OKFDU w ӬଓԽ w 3FBMNΛར༻ w
αʔόαΠυͱฒߦͨ͠։ൃ w 4UVC4FSWFSΛར༻ w ϓϩμΫτνΣοΫ w #FUB#Z$SBTIMZUJDT KFOLJOT GBTUMBOF
͋Γ͕ͱ͏͍͟͝·ͨ͠