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
420
高速開発のためのコード整理術
sutetotanuki
1
1k
Next.js 16の新機能 Cache Components について
sutetotanuki
0
640
Vercel AI SDK を使って Next.js で AIアプリケーションを 作成する方法のご紹介
sutetotanuki
0
1.9k
WEBエンジニア向けAI活用入門
sutetotanuki
0
1.1k
ブラウザ上で実行され、 AIアシスタント付きデータベース postgres.new を触ってみた
sutetotanuki
0
550
今時のCookie事情
sutetotanuki
0
740
高速案件立ち上げで使われるマッハテンプレートのフロントエンド技術選定
sutetotanuki
2
2.1k
Core Web Vitals を改善する Next.js の機能群
sutetotanuki
1
2.7k
Other Decks in Programming
See All in Programming
SREの積み重ねがAI駆動開発のガードレールになった ― 7つの実践/SRE Guardrails The 7
tomoyakitaura
8
4.4k
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
860
JAWS-UG横浜 #102 AWSサ終供養LT会 成仏できない AWS サービスたち 〜本日、三体供養します〜
maroon1st
0
210
型も通る、synthも通る、それでも危ない 〜AIのCDKの権限とコストを機械で検証する〜 / It Passes Type Checks, It Passes Synth Checks, but It’s Still Risky — Automatically Verifying Permissions and Costs in AI’s CDK —
seike460
PRO
1
360
【やさしく解説 設計編 #1】「ドメイン駆動」と「実装駆動」ってなに? 〜設計の考え方を、たとえ話で学ぼう〜
panda728
PRO
1
120
ランチタイムLT会3周年!ランチタイムLT会を3年間続けられたお話
y0hgi
1
140
Honoでのサプライチェーン侵害対策 〜 3つのライブラリに学ぶ
yusukebe
7
1.9k
音楽のための関数型プログラミング言語mimiumにおける多段階計算の活用
tomoyanonymous
1
330
気圧・高度・GPSを記録&可視化するアプリ「Koudo」を作った話
hjmkth
1
360
【やさしく解説 設計編 #0】DDDのコード、読めるのに分からない人へ
panda728
PRO
2
270
アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル
naoya
16
3.5k
AIエージェントで 変わるAndroid開発環境
takahirom
2
680
Featured
See All Featured
Color Theory Basics | Prateek | Gurzu
gurzu
0
390
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
390
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
62
45k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
390
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Documentation Writing (for coders)
carmenintech
77
5.4k
Context Engineering - Making Every Token Count
addyosmani
9
1k
Agile that works and the tools we love
rasmusluckow
331
22k
Why Our Code Smells
bkeepers
PRO
340
58k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Marketing to machines
jonoalderson
1
5.6k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.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 ॳֶऀͷʹܦ͍ͯͰ͢
͝ਗ਼ௌ ͋Γ͕ͱ͏͍͟͝·ͨ͠