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
server-engineer-android-introduction
Search
sutetotanuki
October 12, 2018
Programming
1.1k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
server-engineer-android-introduction
sutetotanuki
October 12, 2018
More Decks by sutetotanuki
See All by sutetotanuki
数案件を同時に進行するためのコンテキスト整理術
sutetotanuki
2
410
高速開発のためのコード整理術
sutetotanuki
1
950
Next.js 16の新機能 Cache Components について
sutetotanuki
0
600
Vercel AI SDK を使って Next.js で AIアプリケーションを 作成する方法のご紹介
sutetotanuki
0
1.9k
WEBエンジニア向けAI活用入門
sutetotanuki
0
1k
ブラウザ上で実行され、 AIアシスタント付きデータベース postgres.new を触ってみた
sutetotanuki
0
530
今時のCookie事情
sutetotanuki
0
730
高速案件立ち上げで使われるマッハテンプレートのフロントエンド技術選定
sutetotanuki
2
2.1k
Core Web Vitals を改善する Next.js の機能群
sutetotanuki
1
2.6k
Other Decks in Programming
See All in Programming
Lessons from Spec-Driven Development
simas
PRO
0
220
技術記事、AIに書かせるか、自分で書くか? 〜それでも私が自分の手で書く理由〜 / #QiitaConference
jnchito
2
1.5k
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
300
エージェンティックRAGにAWSで入門しよう!
har1101
9
1.7k
Skillsは効率化、Agentsは"自分の拡張"——Builder時代のエージェント編成(CC Night 2026)
wemra
1
160
不変条件と整合性境界—ビジネスが決める設計判断と実現パターン / Invariants and Consistency Boundaries
nrslib
14
5.8k
そのテスト、説明できますか?~LWテスト戦略FW~のご紹介
nakahara
0
160
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
4.5k
ふつうのFeature Flag実践入門
irof
8
4.2k
依存関係から依存物へ―Dependencyという言葉の歴史をひも解く
j_lee
0
130
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
0
280
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
5.4k
Featured
See All Featured
Joys of Absence: A Defence of Solitary Play
codingconduct
1
400
Statistics for Hackers
jakevdp
799
230k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.4k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Done Done
chrislema
186
16k
Designing for humans not robots
tammielis
254
26k
Utilizing Notion as your number one productivity tool
mfonobong
4
330
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
440
Unsuck your backbone
ammeep
672
58k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
The browser strikes back
jonoalderson
0
1.3k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.2k
Transcript
αʔόʔαΠυΤϯδχΞ͕ "OESPJEೖͨ͠
ϞόΠϧΞϓϦαʔϏε෦ ୲ϞόΠϧΞϓϦͷόοΫΤϯυ"1* "84ڥߏஙɺӡ༻
ࠓ͢͜ͱ w ͳͥαʔόʔαΠυͷਓ͕"OESPJE w ษڧํ๏ w ࣄͰΘΕ͍ͯΔίʔυͱͷࠩ w σόοΫʹ͑Δπʔϧ
ͳͥαʔόʔαΠυͷ ਓ͕"OESPJE
ओͳཧ༝ w Ͱ͖Δ͜ͱΛ૿ͯ͠௵͕͖͘͠Α͏ʹͨ͠ ͍ɹ w Ұ؏ͯ͠ཧղ͓͖͍ͯͨ͠
N#BBT αʔόʔ N#BBTͷొ ೝূ Ӭଓ 1VTI ͦͷଞ αʔόʔ ೝূ Ӭଓ
1VTI ͦͷଞ ؆୯ͰҰൠతͳϢʔεέʔεͳΒ N#BBTͷΈͰ݁ͯ͠͠·͏͜ͱ ొલ ొޙ
(&5OFXT (&5OPUJpDBUJPO ҰൃͰͱΕΔΑ͏ ʹͯ͘͠Εͳ͍͔ ͳɻɻɻ (&5JOGP Ұ؏ͯ͠Ѳ͓͖͍ͯͨ͠ ࣗͰମݧ͠ͳ͍ͱΘ͔Βͳ͍͜ͱ͕͋Δ
ษڧํ๏
ษڧํ๏ w ·ͣࢿ w ॻ੶ w άάͬͯࣸܦ
ͱΓ͋͑ͣങͬͨ ສ
࠷ॳʹങͬͨຊ
࣍ʹങͬͨຊ
ॻ੶ class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?)
{ // ToastΛදࣔ } class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { // ը໘ͷΩϟϓγϣϯΛมߋ } class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { // μΠΞϩάΛදࣔ }
άάͬͯࣸܦ class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?)
{ // μΠΞϩάΛදࣔ } class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { // μΠΞϩάΛදࣔ } class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { // μΠΞϩάΛදࣔ }
override fun onCreate(savedInstanceState: Bundle?) { // ॲཧ1.. // ॲཧ2.. //
ॲཧ3.. // ॲཧ4.. // ॲཧ5.. PO$SFBUFʹू·Δॲཧ ͍͍͠Ε͵ෆ҆
͔ͪ͘ʹ͍͍ݟຊ͕͋ͬͨ
ࣄͰΘΕ͍ͯΔ ίʔυͱͷࠩ
ࠩ w ΞʔΩςΫνϟ w ඇಉظ w ӬଓԽ w %FCVH5PPMT
ΞʔΩςΫνϟ
දతͳΞʔΩςΫνϟ w .71 w .77.
.71 .PEFM7JFX1SFTFOUFS
.71 .PEFM7JFX1SFTFOUFS 1SFTFOUFS ͕7JFXͷࢀর Λͭ
.77. .PEFM7JFX7JFX.PEFM
.77. .PEFM7JFX7JFX.PEFM ํͷ%"5" #*/%*/(
දతͳΞʔΩςΫνϟ w .71 w J04ͱΞʔΩςΫνϟΛ߹Θ͍ͤ͢ w .77. w %BUB#JOEJOH͋ΔͷͰΑΓ؆ܿʹॻ͚Δ͕ίʔ υ͕ࣗಈੜ͞ΕΔͷͰͱ͖ͬͭʹ͍͘͜ͱ͋
Δ
දతͳΞʔΩςΫνϟ w .71 w .77. ࠓճͬͪ͜
.77. .PEFM7JFX7JFX.PEFM
.77.ͰΘΕΔ ެࣜϥΠϒϥϦ w 7JFX.PEFM w %BUB#JOEJOH w -JWF%BUB
7JFX.PEFM
7JFX.PEFM viewModel = ViewModelProviders.of(this).get(ViewModel::class.java) viewModel = ViewModelProviders.of(activity!!).get(ViewModel::class.java) .BJO"DUJWJUZLU .BJO'SBHNFOULU "DUJWJUZ
'SBHNFOU 7JFX .PEFM "DUJWJUZͷϥΠϑαΠΫϧͷ7JFX.PEFMΛ 'SBHNFOUͰڞ༗Ͱ͖Δ
%BUB#JOEJOH <layout> <data> <variable name="viewModel" type="com.example.ui.main.ViewModel/" /> </data> <EditText android:text="@={viewModel.body}"
/> <Button android:onClick="@{(view)->viewModel.submit()}" /> class ViewModel() { val body = MutableLiveData<String>() fun submit() { // ॲཧ } }
%BUB#JOEJOH <layout> <data> <variable name="viewModel" type="com.example.ui.main.ViewModel/" /> </data> <EditText android:text="@={viewModel.body}"
/> <Button android:onClick="@{(view)->viewModel.submit()}" /> </layout> class ViewModel() { val body = MutableLiveData<String>() fun submit() { // ॲཧ } }
%BUB#JOEJOH <layout> <data> <variable name="viewModel" type="com.example.ui.main.ViewModel/" /> </data> <EditText android:text="@={viewModel.body}"
/> <Button android:onClick="@{(view)->viewModel.submit()}" /> class ViewModel() { val body = MutableLiveData<String>() fun submit() { // ॲཧ } }
%BUB#JOEJOH <layout> <data> <variable name="viewModel" type="com.example.ui.main.ViewModel/" /> </data> <EditText android:text="@={viewModel.body}"
/> <Button android:onClick="@{(view)->viewModel.submit()}" /> class ViewModel() { val body = MutableLiveData<String>() fun submit() { // ॲཧ } }
%BUB#JOEJOH <layout> <data> <variable name="viewModel" type="com.example.ui.main.ViewModel/" /> </data> <EditText android:text="@={viewModel.body}"
/> <Button android:onClick="@{(view)->viewModel.submit()}" /> class ViewModel() { val body = MutableLiveData<String>() fun submit() { // ॲཧ } }
-JWF%BUB 7JFX 7JFX.PEFM -JWF%BUB 3FQPTJUPSZ 4PNF 1SPDFTT ʹมߋ͕͋Ε௨Λड͚ 7JFXΛมߋ Ϣʔβʔͷૢ࡞Ͱ
มߋ͕͋Εઃఆ Ληοτ มߋ͕͋Ε௨
-JWF%BUB <layout> <data> <variable name="viewModel" type="com.example.ui.main.ViewModel/" /> </data> <EditText android:text="@={viewModel.body}"
/> <Button android:onClick="@{(view)->viewModel.submit()}" /> class ViewModel() { val body = MutableLiveData<String>() fun submit() { // ॲཧ } }
-JWF%BUB viewModel.allWords.observe(this, Observer<String> { txt -> // มߋ௨࣌ͷॲཧ })
.77.ಋೖޮՌ w pOE7JFX#Z*Eͷ໓ w WJFXΛૢ࡞͢Δίʔυͷ໓ w PO$SFBUF͔ΒϩδοΫΛΓͤͨ
Ӭଓॲཧ
Ӭଓॲཧ w ϝϞϦʹ࣋ͬͯΔ͚ͩͩͱͳΜ͔͠ΒͷλΠ ϛϯάͰ͙͢ফ͑Δ વ w ඪ४ͷ42-JUFͷૢ࡞ϥΠϒϥϦ͕͋Δ͚Ͳ
3PPN @Entity(tableName = "word_table") data class Word( @PrimaryKey @NonNull @ColumnInfo(name
= "word") var mWord: String )
3PPN @Dao interface WordDao { @Insert fun insert(word: Word) @Query("DELETE
FROM word_table") fun deleteAll() @Query("SELECT * FROM word_table ORDER BY word ASC") fun allWords(): LiveData<List<Word>> }
ҙ w LPUMJOͩͱLBQUΛΘͳ͍ͱ࣮ߦ࣌Τϥʔ ͳΔ w .BJO5ISFBE 6*5ISFBE Ͱ࣮ߦ͢Δͱ ΤϥʔʹͳΔ
ඇಉظॲཧ
ඇಉظॲཧ w .BJO 6* 5ISFBEΛࢭΊͳ͍ͨΊʹ ඇಉظʹॲཧ͢Δඞཁ͕͋Δ w ओʹωοτϫʔΫɺσΟεΫΞΫηε͕ൃ ੜ͢Δॲཧ͕ର
ओͳखஈ w 3Y+BWB w ,PUMJODPSPVUJOFT
3Y+BWB w 3YܥͷϥΠϒϥϦͳͷͰɺͳΕͯΔਓͱͬ ͖͍ͭ͢ w ࠓͷͱ͜Ζͷఆ൪
"OESPJEͰͷ༻ྫ fun done(task: Task) = repository.doneTask(task) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ //
ޭ࣌ͷॲཧ }, { // ࣦഊ࣌ͷॲཧ }) override fun doneTask(task: Task): Completable = Completable.create { try { task.status = Task.Status.DONE db.taskDao().updateTask(task) it.onComplete() } catch (e: Exception) { it.onError(e) } } ॲཧࣗମผεϨουʹͯ͠ ݁ՌΛϝΠϯεϨουͰड͚औΔ
,PUMJODPVSPVUJOFT
,PUMJODPVSPVUJOFT w ·ͩ&YQFSJNFOUBM w ܰྔεϨου
,PUMJODPSPVUJOFT w %JTQBUDIFS ࣮ߦ͢ΔεϨου w +PC DPSPVUJOFΛΩϟϯηϧͰ͖Δ w
$PSPVUJOF$POUFYU ओʹ%JTQBUDIFSͱ+PCͷ Έ߹Θͤ w 4DPQF είʔϓͰ࣮ߦ͞ΕͨDPSPVUJOFࢠ DPSPVUJOFʹͳΔ
είʔϓ ࢠ ࢠ ࢠ +PC $BODFM ͷείʔϓͰ࡞ΒΕͨ $PSPVUJOFࢠ$PSPVUJOFʹͳΔ ͷ+PCΛΩϟϯηϧ͢Δͱ
࠶ؼతʹࢠΛ$BODFM͢Δ
class WordViewModel(application: Application) : AndroidViewModel(application) { private var parentJob =
Job() private val coroutineContext: CoroutineContext get() = parentJob + Dispatchers.Main private val scope = CoroutineScope(coroutineContext) override fun onCleared() { super.onCleared() parentJob.cancel() } } viewModel.scope.launch(Dispatchers.IO) { // ඇಉظʹ͍ͨ͠ॲཧ } "OESPJEͰͷ༻ྫ "DUJWJUZͷഁغ࣌ʹίϧʔνϯΛDBODFM͠ͳ͍ͱ ϝϞϦϦʔΫ͢ΔՄೳੑ͕͋Δ
σόοΫʹ͑Δπʔϧ
%FCVH5PPMT w TUFUIP w IZQFSJPO
TUFUIP w $ISPNFͰ%FW5PPMTͱಉ͡ૢ࡞ੑͰ "OESPJEͷঢ়ଶ͕ΈΕΔ
None
DISPNFJOTQFDUEFWJDFT ʹΞΫηε
ඪ४Ͱ42-JUF 4IBSFE1SFGFSFODFͳͲ͕ݟΕΔ
ϓϥάΠϯΛ͑ωοτϫʔΫ௨৴ΈΕΔ
IZQFSJPO w ΞϓϦͰΞϓϦͷσόοά͕Ͱ͖Δ
None
ࢀߟʹͨ͠ιʔε w %SPJE,BJHJͷެࣜΞϓϦ w (PPHMFެࣜͷ"OESPJE"SDIJUFDUVSF ͷιʔεɻϦϙδτϦͰΞʔΩςΫνϟΛϒ ϥϯνͰΓସ͑ΒΕΔ
͍͞͝ʹ w ͕ಠֶͰษڧͯ͠Δ͚ͩͰͨͲΓ͖ͭʹ ͍͘෦Λ·ͱΊ·ͨ͠ w ॳֶऀͷʹܦ͍ͯͰ͢
͝ਗ਼ௌ ͋Γ͕ͱ͏͍͟͝·ͨ͠