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
server-engineer-android-introduction
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
【登壇資料】AIエージェントに買い物をさせる ― Universal Commerce Protocol(UCP)の紹介」というタイトルで DevelopersIO 2026 Osaka Day 2
sutetotanuki
0
120
数案件を同時に進行するためのコンテキスト整理術
sutetotanuki
2
500
高速開発のためのコード整理術
sutetotanuki
1
1.1k
Next.js 16の新機能 Cache Components について
sutetotanuki
0
750
Vercel AI SDK を使って Next.js で AIアプリケーションを 作成する方法のご紹介
sutetotanuki
0
2k
WEBエンジニア向けAI活用入門
sutetotanuki
0
1.1k
ブラウザ上で実行され、 AIアシスタント付きデータベース postgres.new を触ってみた
sutetotanuki
0
620
今時のCookie事情
sutetotanuki
0
780
高速案件立ち上げで使われるマッハテンプレートのフロントエンド技術選定
sutetotanuki
2
2.2k
Other Decks in Programming
See All in Programming
Turning Architecture into Unit Tests in the AI Era (NSSpain XIV)
steliosf
PRO
1
120
Streamlitで実現する自然言語データアプリ開発
ayumu_yamaguchi
1
330
速く作れる。その次は、速く確かめられる開発へ 〜AIネイティブ開発を支える、Shift Down〜 / Can build fast. Next, moving to development where we can verify fast.
rkaga
8
5.4k
WebRTC映像をAirPlayに対応させる挑戦.pdf
monolithic_adam
0
330
Webの地図
yosuke_furukawa
PRO
6
5k
大喜利で理解するLLM as a Judge / Understanding LLM-as-a-Judge through Ogiri
rockname
0
190
MVNOの申込からeSIM開通までをiOSアプリでつなぐ- 本人確認・MNP・通信事業者基盤をまたぐ実装
satotakeshi
0
530
カツオ、ご期待ください
suneo3476
0
140
ハーネス設計入門 〜 基礎知識の整理から実務へのステップアップ 〜
kinopeee
20
20k
そのリトライ、死んだコネクションを使い回していませんか ── GoのHTTPクライアントとHTTP/2を実プロダクト障害から学び直す
myus4a
0
380
SONY CISC-NEWS NWS-1750 + NWB-225 フレームバッファの NetBSD/news68k ドライバ実装 / OSC2026Hiroshima
tsutsui
0
170
Apple Intelligence を用いた個人情報誤送信防止、及びユーザーリクエスト体験の改善について
yukiny
0
280
Featured
See All Featured
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
550
Designing for Timeless Needs
cassininazir
1
510
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
550
Music & Morning Musume
bryan
48
7.4k
My Coaching Mixtape
mlcsv
0
340
Google's AI Overviews - The New Search
badams
0
1.6k
Claude Code のすすめ
schroneko
67
230k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
850
So, you think you're a good person
axbom
PRO
2
2.2k
What's in a price? How to price your products and services
michaelherold
247
13k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Documentation Writing (for coders)
carmenintech
77
5.6k
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 ॳֶऀͷʹܦ͍ͯͰ͢
͝ਗ਼ௌ ͋Γ͕ͱ͏͍͟͝·ͨ͠