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
Android Architecture Components
Search
takahirom
June 02, 2017
1.4k
11
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Android Architecture Components
参考リンク集:
https://gist.github.com/takahirom/f8b0627198db591270fb2963361dd516
takahirom
June 02, 2017
More Decks by takahirom
See All by takahirom
AndroidアプリのAI実装をAndroidifyで学ぶ ー Google公式サンプルによる体験と実装 ー
takahirom
0
140
AIエージェントによるテストフレームワーク Arbigent
takahirom
0
1k
Google の LLM ライブラリ を Android アプリで 使うには?
takahirom
1
2.1k
Robolectric Native Graphics and Roborazzi
takahirom
1
2.3k
Androidアプリで安定して動作させ継続的に開発するために設計の原則を利用して開発した話
takahirom
3
1.4k
Android Tools & Performance
takahirom
1
1.2k
Jetpack Compose State Practices
takahirom
1
1.5k
Inside Jetpack Compose
takahirom
1
1.1k
What’s new in Android Jetpack and Tools
takahirom
0
430
Featured
See All Featured
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.1k
Tell your own story through comics
letsgokoyo
1
950
Reality Check: Gamification 10 Years Later
codingconduct
0
2.2k
Making the Leap to Tech Lead
cromwellryan
135
9.9k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.2k
The SEO Collaboration Effect
kristinabergwall1
1
490
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
560
Building an army of robots
kneath
306
46k
Test your architecture with Archunit
thirion
1
2.3k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Thoughts on Productivity
jonyablonski
76
5.2k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
270
Transcript
"OESPJE "SDIJUFDUVSF$PNQPOFOUT 4IJCVZBBQL 3FQPSUGSPN(PPHMF*0 UBLBIJSPN
˖ "OESPJEָ㥨ֹדׅ ˖ 5XJUUFSכUBLBIJSPN !OFX@SVOOBCMF ˖ UBLBIJSPNהְֲせד 2JJUBזו剅ְגְךד ״׃ֶֻ격ְ׃תׅ
荈䊹稱➜
⟃♴אךإحءّٝ ˖ *OUSPEVDUJPO ˖ 4PMWJOHUIF-JGFDZDMF1SPCMFN ˖ 1FSTJTUFODFBOE0JOF (PPHMF*0דך "SDIJUFDUVSF$PNQPOFOUT
⟃♴אךإحءّٝ ˖ *OUSPEVDUJPO ˖ "OESPJE"SDIJUFDUVSF$PNQPOFOUTך嚊銲铡僇 ˖ "OESPJE%FWFMPQFSTך (VJEFUP"QQ"SDIJUFDUVSF ˖ 4PMWJOHUIF-JGFDZDMF1SPCMFN
˖ -JGFDZDMFꟼ鸬ך$PNQPOFOUT ˖ 1FSTJTUFODFBOE0JOF ˖ 宕竲⻉ٓ؎ـٓٔך3PPN $PNQPOFOUTךא (PPHMF*0דך "SDIJUFDUVSF$PNQPOFOUT
(VJEFUP"QQ"SDIJUFDUVSF
(VJEFUP"QQ"SDIJUFDUVSF "SDIJUFDUVSF$PNQPOFOUT⢪欽׃גծ 㛙暕דٌآُ٦ٕ⻉װذأزָ〳腉ז،فٔ 圓眠ׅ倯岀ָ剅ַגְ IUUQTEFWFMPQFSTKQHPPHMFCMPHDPNBOESPJEBOEBSDIJUFDUVSFIUNM״
湡如 ˖ "SDIJUFDUVSF$PNQPOFOUTהכ ˖ "SDIJUFDUVSF$PNQPOFOUTךぐ갪湡ך知⽃ז 铡僇 ˖ (VJEFUP"QQ"SDIJUFDUVSFד铡僇ׁגְ ⾱ך铡僇 ˖
(VJEFUP"QQ"SDIJUFDUVSFח㹋鄲 鋅ג
"OESPJE "SDIJUFDUVSF$PNQPOFOUTה כ
– Android DevelopersͷAndroid Architecture ComponentsΑΓ l"OFXDPMMFDUJPOPGMJCSBSJFTUIBUIFMQZPV EFTJHOSPCVTU UFTUBCMF BOENBJOUBJOBCMF BQQT
4UBSUXJUIDMBTTFTGPSNBOBHJOHZPVS6* $PNQPOFOUTMJGFDZDMFBOEIBOEMJOHEBUB QFSTJTUFODFz 㛙暕דծذأز〳腉דծًٝذشٝأ׃װְׅ،فٔך 鏣鎘⸔ֽ倜׃ְٓ؎ـٓٔך꧊תדׅկ 6*؝ٝه٦طٝزךٓ؎ؿ؟؎ؙٕך盖椚ה ر٦ةך宕竲⻉䪔ֲךؙٓأַ㨣גת׃׳ֲկ
"SDIJUFDUVSF$PNQPOFOUTך 圓䧭銲稆 ˖ -JGFDZDMF0XOFS -JGFDZMF0CTFSWFS ˖ ٓ؎ؿ؟؎ؙٕ䠐陎׃؝ٝه٦طٝز⡲䧭ֿׅהָ דֹ ˖ -JWF%BUB
˖ 錁庠〳腉 0CTFSWBCMF זر٦ةمٕت٦ ˖ 7JFX.PEFM ˖ 6*חꟼ鸬ׅر٦ة⥂䭯ؙׅٓأ ˖ 3PPN ˖ 42-JUF知⽃ח䪔ֲٓ؎ـٓٔ 42-JUFךػٙ٦崞欽׃ծ厫鮾חر٦ةك٦أח،ؙإأדֹؔـ آؙؑزوحؾؚٝ䬄韋⻉ٖ؎َ٦䲿⣘
˖ -JGFDZDMF0XOFS -JGFDZMF0CTFSWFS ˖ -JWF%BUB ˖ 7JFX.PEFM ˖ 3PPN "SDIJUFDUVSF$PNQPOFOUTך
圓䧭銲稆 NBWFOQBDLBHFך⣛㶷ꟼ⤘
♧א׆א知⽃ח 鋅גְֹתׅ
class MyLifecycleActivity : LifecycleActivity() { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) this.lifecycle.addObserver(MyObserver()) } } class MyObserver : LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) fun onResume() { Log.d("MyObserver","onResume") } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) fun onPause() { Log.d("MyObserver","onPause") } } -JGFDZDMF0XOFS -JGFDZMF0CTFSWFSהכ ٓ؎ؿ؟؎ؙٕ䠐陎׃؝ٝه٦طٝز⡲䧭ֿׅהָ דֹ
class MyLifecycleActivity : LifecycleActivity() { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) this.lifecycle.addObserver(MyObserver()) } } class MyObserver : LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) fun onResume() { Log.d("MyObserver","onResume") } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) fun onPause() { Log.d("MyObserver","onPause") } } -JGFDZDMF0XOFS -JGFDZMF0CTFSWFSהכ -JGFDZDMF"DUJWJUZכ -JGFDZDMF0XOFS㹋鄲׃גְ "QQ$PNQBU"DUJWJUZח窟さ✮㹀
class MyLifecycleActivity : LifecycleActivity() { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) this.lifecycle.addObserver(MyObserver()) } } class MyObserver : LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) fun onResume() { Log.d("MyObserver","onResume") } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) fun onPause() { Log.d("MyObserver","onPause") } } -JGFDZDMF0XOFS -JGFDZMF0CTFSWFSהכ -JGFDZDMF0XOFSַ -JGFDZDMFؔـآؙؑز《䖤׃ BEE0CTFSWFSׅ
class MyLifecycleActivity : LifecycleActivity() { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) this.lifecycle.addObserver(MyObserver()) } } class MyObserver : LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) fun onResume() { Log.d("MyObserver","onResume") } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) fun onPause() { Log.d("MyObserver","onPause") } } -JGFDZDMF0XOFS -JGFDZMF0CTFSWFSהכ -JGFDZDMF0CTFSWFSדכ !0O-JGFDZDMF&WFOUדٓ؎ؿ؟؎ؙٕך ؎كٝز「ֽ《ֿהָ⳿勻
class MyLifecycleActivity : LifecycleActivity() { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) this.lifecycle.addObserver(MyObserver()) } } class MyObserver : LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) fun onResume() { Log.d("MyObserver","onResume") } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) fun onPause() { Log.d("MyObserver","onPause") } } -JGFDZDMF0XOFS -JGFDZMF0CTFSWFSהכ ٓ؎ؿ؟؎ؙٕ䠐陎׃؝ٝه٦طٝزָ⡲䧭דֹ
˖ 㣐ְֹ'SBHNFOUװ"DUJWJUZⴓ鍑ֿׅהָ ⳿勻 ˖ ؔـآؙؑزָٓ؎ؿ؟؎ؙٕד盖椚ָׁ גְ朐䡾חז ˖ ٓ؎ـٓٔ⡲儗ח⢪ִ ˖ ؕأةي-JGFDZDMF0XOFS⡲ֿהדذأز
ָ〳腉חז -JGFDZDMF0XOFS -JGFDZMF0CTFSWFSכז䗳銲ַ
-JGFDZDMF0XOFS -JGFDZMF0CTFSWFS דכ ְז؎كٝز鋅ג 黝ⴖח盖椚ׅ䗳銲ָ֮
-JWF%BUBהה嚂ח ז
˖ 錁庠〳腉 0CTFSWBCMF זر٦ةمٕت٦ ˖ ٓ؎ؿ؟؎ؙٕח״⹛ָֹ㢌 val stringLiveData = //
LiveDataΫϥεͷΠϯελϯε࡞ stringLiveData.observe(this, Observer<String?> { value -> // σʔλΛऔಘɺมߋ͞ΕͨΒݺΕΔ }) -JWF%BUB
˖ ر٦ةָإحزׁ儗ח -JWF%BUBכ4UBUF45"35&%ד֮ל ر٦ةPCTFSWF׃גְؔـآؙؑزח床ׅ ˖ 荈⹛ד飑铣ך盖椚ָדֹ 䩛חPO%FTUPSZדSFNPWF0CTFSWFSׁ ˖ 歗ַꨄגְג䨱גֹ儗חծ
剑倜ךر٦ة床ׅ -JWF%BUB ٓ؎ؿ؟؎ؙٕ䠐陎׃זֻגؙٓحءׇُ׆ח 知⽃חⳢ椚ָדֹ
class LocationLiveData(context: Context) : LiveData<Location>() { private val locationManager: LocationManager
= context.getSystemService( Context.LOCATION_SERVICE) as LocationManager private val listener = object : LocationListener { override fun onLocationChanged(location: Location) { value = location } … } override fun onActive() { locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0f, listener) } override fun onInactive() { locationManager.removeUpdates(listener) } } -JWF%BUBך⡲倯 ⡘縧䞔㜠床ׅ-JWF%BUBך⢽
class LocationLiveData(context: Context) : LiveData<Location>() { private val locationManager: LocationManager
= context.getSystemService( Context.LOCATION_SERVICE) as LocationManager private val listener = object : LocationListener { override fun onLocationChanged(location: Location) { value = location } … } override fun onActive() { locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0f, listener) } override fun onInactive() { locationManager.removeUpdates(listener) } } -JWF%BUBך⡲倯 -JWF%BUBؙٓأ竰䪫ׅ
class LocationLiveData(context: Context) : LiveData<Location>() { private val locationManager: LocationManager
= context.getSystemService( Context.LOCATION_SERVICE) as LocationManager private val listener = object : LocationListener { override fun onLocationChanged(location: Location) { value = location } … } override fun onActive() { locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0f, listener) } override fun onInactive() { locationManager.removeUpdates(listener) } } -JWF%BUBך⡲倯 PO"DUJWF ד -PDBUJPO.BOBHFSךٔأش٦إحز
class LocationLiveData(context: Context) : LiveData<Location>() { private val locationManager: LocationManager
= context.getSystemService( Context.LOCATION_SERVICE) as LocationManager private val listener = object : LocationListener { override fun onLocationChanged(location: Location) { value = location } … } override fun onActive() { locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0f, listener) } override fun onInactive() { locationManager.removeUpdates(listener) } } -JWF%BUBך⡲倯 ⡘縧䞔㜠ח㢌刿ָ֮-JWF%BUBTFU7BMVFㄎן⳿ׅ
class LocationLiveData(context: Context) : LiveData<Location>() { private val locationManager: LocationManager
= context.getSystemService( Context.LOCATION_SERVICE) as LocationManager private val listener = object : LocationListener { override fun onLocationChanged(location: Location) { value = location } … } override fun onActive() { locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0f, listener) } override fun onInactive() { locationManager.removeUpdates(listener) } } -JWF%BUBך⡲倯 PO*OBDUJWF ד ٔأش٦ꤐׅ
class MyLifecycleActivity : LifecycleActivity() { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) val stringLiveData = // LiveDataΫϥεͷΠϯελϯε࡞ stringLiveData.observe(this, Observer<String?> { value -> // σʔλΛऔಘɺมߋݕ }) 歗㔐鯄儗ח"DUJWJUZָⱄ欰䧭ׁծתPO$SFBUFָㄎלծ ⱄ《䖤ׁג׃תֲ -JWF%BUB⢪גְ儗ח 歗㔐鯄ָ饯ֿהծծ ֿד7JFX.PEFM
7JFX.PEFM ˖ 7JFX.PEFMכ歗㔐鯄׃ג 婍竲ֽկ ˖ 6*ךךر٦ة⥂䭯ׅ ˖ GSBHNFOUך؝ىُص؛٦ ءّٖٝ؎َ٦ה׃ג堣腉 ׅ
7JFX.PEFM class MyLifecycleActivity : LifecycleActivity() { override fun onCreate(savedInstanceState: Bundle?)
{ super.onCreate(savedInstanceState) val activityViewModel = ViewModelProviders.of(this) .get(MyActivityViewModel::class.java) val locationLiveData = activityViewModel.locationLiveData locationLiveData.observe(this, Observer<Location?> { location -> // }) ... } class MyActivityViewModel(application: Application): AndroidViewModel(application) { val locationLiveData: LocationLiveData = LocationLiveData(application) }
7JFX.PEFM class MyLifecycleActivity : LifecycleActivity() { override fun onCreate(savedInstanceState: Bundle?)
{ super.onCreate(savedInstanceState) val activityViewModel = ViewModelProviders.of(this) .get(MyActivityViewModel::class.java) val locationLiveData = activityViewModel.locationLiveData locationLiveData.observe(this, Observer<Location?> { location -> // }) ... } class MyActivityViewModel(application: Application): AndroidViewModel(application) { val locationLiveData: LocationLiveData = LocationLiveData(application) } 7JFX.PEFM1SPWJEFSTַ7JFX.PEFM《䖤ׅ
7JFX.PEFM class MyLifecycleActivity : LifecycleActivity() { override fun onCreate(savedInstanceState: Bundle?)
{ super.onCreate(savedInstanceState) val activityViewModel = ViewModelProviders.of(this) .get(MyActivityViewModel::class.java) val locationLiveData = activityViewModel.locationLiveData locationLiveData.observe(this, Observer<Location?> { location -> // }) ... } class MyActivityViewModel(application: Application): AndroidViewModel(application) { val locationLiveData: LocationLiveData = LocationLiveData(application) } 7JFX.PEFMדכ-JWF%BUB⥂䭯ׅ "OESPJE7JFX.PEFM⢪ֲהBQQMJDBUJPOָ⢪ִ
7JFX.PEFM class MyLifecycleActivity : LifecycleActivity() { override fun onCreate(savedInstanceState: Bundle?)
{ super.onCreate(savedInstanceState) val activityViewModel = ViewModelProviders.of(this) .get(MyActivityViewModel::class.java) val locationLiveData = activityViewModel.locationLiveData locationLiveData.observe(this, Observer<Location?> { location -> // }) ... } class MyActivityViewModel(application: Application): ViewModel() { val locationLiveData: LocationLiveData = LocationLiveData(application) } -JWF%BUBך朐䡾湊鋔ׅ
3PPN
3PPN ˖ 42-JUF䪔ְװֻׅׅٓ؎ـٓٔ ˖ ؝ٝػ؎ٕ儗חָؙؒٔ嗚鏾ׁ ˖ 42-JUFⵃ欽ׅ儗חⱔꞿז؝٦سְָזְ ˖ אך㣐ֹז؝ٝه٦طٝزָ֮ ˖
&OUJUZ %BUB"DDFTT0CKFDU %BUBCBTF
&OUJUZ @Entity class Memo(@PrimaryKey(autoGenerate = true) val uid: Int =
0, val title: String, val text: String) !&OUJUZאֽ !1SJNBSZ,FZד1SJNBSZ,FZה׃גو٦ؙאֽծ JE䩛ח⡲גֻؔفءָّׅ֮ٝ
%BUB"DDFTT0CKFDU @Dao interface MemoDao { @Query("SELECT * FROM memo ORDER
BY uid DESC") fun get(): LiveData<List<Memo>> @Insert fun insertAll(vararg memos: Memo) @Update fun editMemo(memo: Memo) } !%BPאֽ ؝ٝػ؎ٕ儗ח!2VFSZך42-ךⰻ㺁ָ嗚鏾ׁ ؝ٝػ؎ٕ儗ח؝٦سָ欰䧭ׁ 鵤⦼ח-JWF%BUBװ3Y+BWBך'MPXBCMFⵃ欽ׅה ر٦ةك٦أך刿倜「ֽ《
3PPN%BUBCBTF @Database(entities = arrayOf(Memo::class), version = 1) abstract class AppDatabase
: RoomDatabase() { abstract fun memoDao(): MemoDao } val db = Room.databaseBuilder(application, AppDatabase::class.java, "database-name").build() fun getMemo(): LiveData<List<Memo>> { return db.memoDao().get() } !%BUBCBTFאֽ FOUJUJFTװWFSTJPO䭷㹀ׅ
(VJEFUP"QQ"SDIJUFDUVSF
(VJEFUP"QQ"SDIJUFDUVSF ⰻ㺁 ˖ "OESPJE،فٔ涪ח黝欽ׁ ⾱ך㹀纏 ˖ ך⾱黝欽דֹ ،فٔ،٦ؗذؙثٍך铡僇 ˖ ،٦ؗذؙثٍ؝ٝه٦طٝز
⢪،٦ؗذؙثٍך㹋鄲倯岀 ך铡僇 IUUQTEFWFMPQFSTKQHPPHMFCMPHDPNBOESPJEBOEBSDIJUFDUVSFIUNM״ IUUQTEFWFMPQFSBOESPJEDPNUPQJDMJCSBSJFTBSDIJUFDUVSFHVJEFIUNM
אך鏣鎘ך♳דꅾ銲ז銲稆ָ֮ה剅ַגְկ ˖ ְלꅾ銲זךכꟼ䗰✲ךⴓꨄկ"DUJWJUZװ 'SBHNFOUחⰋג剅ַךָ״ֻ֮麩ְկ ˖ 04ח״盖椚ׁؙٓأד֮ծ ٓ؎ؿ؟؎ؙٕך㉏겗鼘ֽկ ˖ 宕竲⻉ׁٌرַٕ6*⹛ַֿׅהկ
˖ 04ח״ٔا٦أ鍑佝הطحزٙ٦ؙ䱸竲ָ♶ 㸜㹀ז儗חِ٦ؠ٦ָر٦ة㣟זְ״ֲח ׅկ "OESPJE،فٔ涪ח黝欽ׁ⾱ך㹀纏 $PNNPOBSDIJUFDUVSBMQSJODJQMFT IUUQTEFWFMPQFSBOESPJEDPNUPQJDMJCSBSJFTBSDIJUFDUVSFHVJEFIUNM״
䭷ꆙ (VJEJOHQSJODJQMFT ˖ "DUJWJUZծ4FSWJDFזוחכر٦ة⥂䭯׃זְ ˖ ٌآُ٦ٕך顑ⴓꨄ׃״ֲ ˖ ٌآُ٦ٕדװ《ׅ㜥さכⰻ鿇㹋鄲Ⱅ׃זְ ˖ ٌآُ٦ٕדװ《ׅ㜥さכذأزָדֹ״ֲחׅ
˖ ن؎ٓ٦فٖ٦زז؝٦س⡦䏝剅ְג儗嶊顤׃זְ "SDIJUFDUVSF$PNQPOFOUTװ䱿㤺הזגְٓ؎ـٓٔⵃ欽ׅ ˖ ؔؿٓ؎ٝד⹛⡲ׅ״ֲח倜׃ְꟼ鸬ָ֮ر٦ة⥂㶷ֿׅה ˖ ずׄر٦ةا٦أַ邌爙遤ֲ״ֲחׅ ♧אך-JWF%BUB醱侧ךהֿד鋅ׅ IUUQTEFWFMPQFSBOESPJEDPNUPQJDMJCSBSJFTBSDIJUFDUVSFHVJEFIUNM״
"SDIJUFDUVSF$PNQPOFOUT ך؟ٝفٕ،فٔ鋅ג וז괏חך؝ٝ ه٦طٝز⢪ֲַ鋅ג ״ֲ
؟ٝفٕ؝٦س鋅גְֲֿ (JU)VCךٔهآزٔ嗚稊׃ ِ٦ؠ٦ךٔهآزٔ♧鋮邌爙 דֹ،فٔ BOESPJEBSDIJUFDUVSF$PNQPOFOUTך؟ٝفٕ ،فٔך♧鸬ךⳢ椚ך崧鋅ג IUUQRJJUBDPNUBLBIJSPNJUFNT BGFEDFCB IUUQTHJUIVCDPNHPPHMFTBNQMFT BOESPJEBSDIJUFDUVSFDPNQPOFOUTUSFF
NBTUFS(JUIVC#SPXTFS4BNQMF
؟ٝفٕ؝٦س鋅גְֲֿ ➙㔐כ俑㶵Ⰵ⸂׃גؒٝة٦ 䬃׃גַך⹛ֹ鋅גת׃׳ֲ
'SBHNFOU7JFX.PEFM IUUQTEFWFMPQFSBOESPJEDPNUPQJDMJCSBSJFTBSDIJUFDUVSFHVJEFIUNM״
public class SearchFragment extends LifecycleFragment implements Injectable { @Inject ViewModelProvider.Factory
viewModelFactory; private SearchViewModel searchViewModel; ... @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); searchViewModel = ViewModelProviders.of(this, viewModelFactory).get(SearchViewModel.class); ... private void doSearch(View v) { String query = binding.get().input.getText().toString(); ... // ͜͜ͰViewModelͷݺͼग़͠ʂʂ searchViewModel.setQuery(query); } 'SBHNFOU7JFX.PEFM
public class SearchFragment extends LifecycleFragment implements Injectable { @Inject ViewModelProvider.Factory
viewModelFactory; private SearchViewModel searchViewModel; ... @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); searchViewModel = ViewModelProviders.of(this, viewModelFactory).get(SearchViewModel.class); ... private void doSearch(View v) { String query = binding.get().input.getText().toString(); ... // ͜͜ͰViewModelͷݺͼग़͠ʂʂ searchViewModel.setQuery(query); } 'SBHNFOU7JFX.PEFM 7JFX.PEFM1SPWJEFSTח״ TFBSDI7JFX.PEFM⡲䧭ׅ
public class SearchFragment extends LifecycleFragment implements Injectable { @Inject ViewModelProvider.Factory
viewModelFactory; private SearchViewModel searchViewModel; ... @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); searchViewModel = ViewModelProviders.of(this, viewModelFactory).get(SearchViewModel.class); ... private void doSearch(View v) { String query = binding.get().input.getText().toString(); ... // ͜͜ͰViewModelͷݺͼग़͠ʂʂ searchViewModel.setQuery(query); } 'SBHNFOU7JFX.PEFM 杝荈ך7JFX.PEFM1SPWJEFS'BDUPSZד7JFX.PEFM⡲ֿהד 7JFX.PEFMךٌحؙ⡲ֿהָדֹծذأز〳腉ח
public class SearchFragment extends LifecycleFragment implements Injectable { @Inject ViewModelProvider.Factory
viewModelFactory; private SearchViewModel searchViewModel; ... @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); searchViewModel = ViewModelProviders.of(this, viewModelFactory).get(SearchViewModel.class); ... private void doSearch(View v) { String query = binding.get().input.getText().toString(); ... // ͜͜ͰViewModelͷݺͼग़͠ʂʂ searchViewModel.setQuery(query); } 'SBHNFOU7JFX.PEFM &EJU5FYUך؎كٝز״ EP4FBSDIָㄎן⳿ׁ
public class SearchFragment extends LifecycleFragment implements Injectable { @Inject ViewModelProvider.Factory
viewModelFactory; private SearchViewModel searchViewModel; ... @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); searchViewModel = ViewModelProviders.of(this, viewModelFactory).get(SearchViewModel.class); ... private void doSearch(View v) { String query = binding.get().input.getText().toString(); ... // ͜͜ͰViewModelͷݺͼग़͠ʂʂ searchViewModel.setQuery(query); } 'SBHNFOU7JFX.PEFM 7JFX.PEFMㄎן⳿ׅ
7JFX.PEFM3FQPTJUPSZ
public class SearchViewModel extends ViewModel { private final LiveData<Resource<List<Repo>>> results;
private final MutableLiveData<String> query = new MutableLiveData<>(); ... public void setQuery(@NonNull String originalInput) { String input = originalInput.toLowerCase(Locale.getDefault()).trim(); ... query.setValue(input); } ... @Inject SearchViewModel(RepoRepository repoRepository) { ... results = Transformations.switchMap(query, search -> { if (search == null || search.trim().length() == 0) { return AbsentLiveData.create(); } else { return repoRepository.search(search); } }); } ... 7JFX.PEFM3FQPTJUPSZ
public class SearchViewModel extends ViewModel { private final LiveData<Resource<List<Repo>>> results;
private final MutableLiveData<String> query = new MutableLiveData<>(); ... public void setQuery(@NonNull String originalInput) { String input = originalInput.toLowerCase(Locale.getDefault()).trim(); ... query.setValue(input); } ... @Inject SearchViewModel(RepoRepository repoRepository) { ... results = Transformations.switchMap(query, search -> { if (search == null || search.trim().length() == 0) { return AbsentLiveData.create(); } else { return repoRepository.search(search); } }); } ... 7JFX.PEFM3FQPTJUPSZ 7JFX.PEFMך⚥ד-JWF%BUB⥂䭯׃גְ
public class SearchViewModel extends ViewModel { private final LiveData<Resource<List<Repo>>> results;
private final MutableLiveData<String> query = new MutableLiveData<>(); ... public void setQuery(@NonNull String originalInput) { String input = originalInput.toLowerCase(Locale.getDefault()).trim(); ... query.setValue(input); } ... @Inject SearchViewModel(RepoRepository repoRepository) { ... results = Transformations.switchMap(query, search -> { if (search == null || search.trim().length() == 0) { return AbsentLiveData.create(); } else { return repoRepository.search(search); } }); } ... 7JFX.PEFM3FQPTJUPSZ ת׆ծ-JWF%BUBؙٓأך؎ٝأةٝأךRVFSZח㼎׃ג TFU7BMVF
public class SearchViewModel extends ViewModel { private final LiveData<Resource<List<Repo>>> results;
private final MutableLiveData<String> query = new MutableLiveData<>(); ... public void setQuery(@NonNull String originalInput) { ... SearchViewModel(RepoRepository repoRepository) { ... results = Transformations.switchMap(query, search -> { if (search == null || search.trim().length() == 0) { return AbsentLiveData.create(); } else { return repoRepository.search(search); } }); } ... 7JFX.PEFM3FQPTJUPSZ 5SBOTGPSNBUJPOTTXJUDI.BQח״ RVFSZָ㢌刿ׁ؝٦ٕغحָؙ㹋遤ׁ
public class SearchViewModel extends ViewModel { private final LiveData<Resource<List<Repo>>> results;
private final MutableLiveData<String> query = new MutableLiveData<>(); ... public void setQuery(@NonNull String originalInput) { ... SearchViewModel(RepoRepository repoRepository) { ... results = Transformations.switchMap(query, search -> { if (search == null || search.trim().length() == 0) { return AbsentLiveData.create(); } else { return repoRepository.search(search); } }); } ... 7JFX.PEFM3FQPTJUPSZ SFQP3FQPTJUPSZַ嗚稊穠卓ך-JWF%BUB《䖤׃ג ًٝغ㢌侧חⰅ
3FQPTJUPSZ .PEFM 3FNPUF%BUB4PVSDF
3FQPTJUPSZ .PEFM 3FNPUF%BUB4PVSDF @Singleton public class RepoRepository { ... public
LiveData<Resource<List<Repo>>> search(String query) { return new NetworkBoundResource<List<Repo>, RepoSearchResponse>(appExecutors) { @Override protected void saveCallResult(@NonNull RepoSearchResponse item) { ... } @NonNull @Override protected LiveData<List<Repo>> loadFromDb() { ... } @Override protected boolean shouldFetch(@Nullable List<Repo> data) { ... } @NonNull @Override protected LiveData<ApiResponse<RepoSearchResponse>> createCall() { ... } @Override protected RepoSearchResponse processResponse(ApiResponse<RepoSearchResponse> response) { ... } }.asLiveData(); }
3FQPTJUPSZ .PEFM 3FNPUF%BUB4PVSDF @Singleton public class RepoRepository { ... public
LiveData<Resource<List<Repo>>> search(String query) { return new NetworkBoundResource<List<Repo>, RepoSearchResponse>(appExecutors) { @Override protected void saveCallResult(@NonNull RepoSearchResponse item) { ... } @NonNull @Override protected LiveData<List<Repo>> loadFromDb() { ... } @Override protected boolean shouldFetch(@Nullable List<Repo> data) { ... } @NonNull @Override protected LiveData<ApiResponse<RepoSearchResponse>> createCall() { ... } @Override protected RepoSearchResponse processResponse(ApiResponse<RepoSearchResponse> response) { ... } }.asLiveData(); } /FUXPSL#PVOE3FTPVSDF 䖓鶢 ⵃ欽׃ծ ְֻאַך؝٦ٕغحؙ㹋鄲׃ծ-JWF%BUBה׃ג鵤ׅ
3FQPTJUPSZ .PEFM @Singleton public class RepoRepository { ... public LiveData<Resource<List<Repo>>>
search(String query) { return new NetworkBoundResource<List<Repo>, RepoSearchResponse>(appExecutors) { ... @NonNull @Override protected LiveData<List<Repo>> loadFromDb() { return Transformations.switchMap(repoDao.search(query), searchData -> { if (searchData == null) { return AbsentLiveData.create(); } else { return repoDao.loadOrdered(searchData.repoIds); } }); } @NonNull @Override protected LiveData<ApiResponse<RepoSearchResponse>> createCall() { return githubService.searchRepos(query); } @Override /FUXPSL#PVOE3FTPVSDF 䖓鶢 ך ؝٦ٕغحؙⰻדSFQP%BPַر٦ة《䖤ׅ 3FQP%BPؙٓأכ3PPN⢪גְ
3FQPTJUPSZ 3FNPUF%BUB4PVSDF @Singleton public class RepoRepository { ... public LiveData<Resource<List<Repo>>>
search(String query) { return new NetworkBoundResource<List<Repo>, RepoSearchResponse>(appExecutors) { ... @NonNull @Override protected LiveData<ApiResponse<RepoSearchResponse>> createCall() { return githubService.searchRepos(query); } @Override protected RepoSearchResponse processResponse(ApiResponse<RepoSearchResponse> response { ... }.asLiveData(); } /FUXPSL#PVOE3FTPVSDF 䖓鶢 ך ؝٦ٕغحؙⰻד 3FUSPUך؟٦ؽأؙٓأַ《䖤ׅ
/FUXPSL#PVOE3FTPVSDFכזח ׃גְַ /FUXPSL#PVOE3FTPVSDFך寸㹀加 طحزٙ٦ַؙر٦ة 《䖤׃אא ر؍أؙחٍؗحءُ׃ ر٦ةٗ٦سׅ崧 IUUQTEFWFMPQFSBOESPJEDPNUPQJDMJCSBSJFTBSDIJUFDUVSFHVJEFIUNM״
3PPN⢪גծ%#湊鋔ׅ
3PPN⢪גծ%#湊鋔ׅ ر٦ةָ ֮ל -JWF%BUBה׃ג⦼ 6*ח崧ׅ
3PPN⢪גծ%#湊鋔ׅ %#חر٦ةָ ֮ל -JWF%BUBה׃ג⦼ 6*ח崧ׅ ⦼؟٦غ٦ַ《䖤ַׅ וֲַⴻ㹀
֮ל -JWF%BUBה׃ג⦼ 6*ח崧ׅ ⦼؟٦غ٦ַ《䖤ַׅ וֲַⴻ㹀 "1*זו〨ְגر٦ة《䖤
-JWF%BUBה׃ג⦼ 6*ח崧ׅ ⦼؟٦غ٦ַ《䖤ַׅ וֲַⴻ㹀 "1*זו〨ְגر٦ة《䖤 㣟侁׃㣟侁ך朐䡾 -JWF%BUBך⦼ה׃ג崧ׅ
⦼؟٦غ٦ַ《䖤ַׅ וֲַⴻ㹀 "1*זו〨ְגر٦ة《䖤 㣟侁׃㣟侁ך朐䡾 -JWF%BUBך⦼ה׃ג崧ׅ 䧭⸆׃%JTLח⥂㶷
⥂㶷ׅהծ♳ח䨱 6*ח僥ׁ
3FQPTJUPSZ .PEFM @Singleton public class RepoRepository { ... public LiveData<Resource<List<Repo>>>
search(String query) { return new NetworkBoundResource<List<Repo>, RepoSearchResponse>(appExecutors) { ... ... }.asLiveData(); } 穠卓כ-JWF%BUBה׃ג鵤ׅ
3FQPTJUPSZ .PEFM 3FNPUF%BUB4PVSDF
3FQPTJUPSZ .PEFM 3FNPUF%BUB4PVSDF public class SearchFragment extends LifecycleFragment implements Injectable
{ ... searchViewModel.getResults().observe(this, result -> { binding.get().setSearchResource(result); binding.get().setResultCount((result == null || result.data == null) ? 0 : result.data.size()); adapter.get().replace(result == null ? null : result.data); binding.get().executePendingBindings(); }); 7JFX.PEFMך-JWF%BUB湊鋔ֿׅהדծ 7JFXח僥ׅ
˖ "SDIJUFDUVSF$PNQPOFOUTכٓ؎ـٓٔה׃ג 3PPNֽזוծ⦐ⴽדⵃ欽דֲֹ ˖ (VJEFUP"QQ"SDIJUFDUVSFח剅ַגְֿהכ וְֲֲ鏣鎘׃גְגծ罋חזֲ ˖ 宕竲⻉㣐✲ ˖ "SDIJUFDUVSF$PNQPOFOUT⢪ֲה"OESPJEך؝
ٝه٦طٝزהֲתֻ⹛⡲ׅ،فָٔծ嚂חַ ֲֽ תה
˖ 罋ؙٔٝ꧊ ˖ IUUQTHJTUHJUIVCDPNUBLBIJSPN GCECGCEE 罋