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
Signal Forms: Details & Live Coding @enterJS 2026 in Mannheim
manfredsteyer
PRO
0
190
Developing with AI Agents — Codex, Claude Code & Cowork Practical Guide
x5gtrn
PRO
0
1.3k
Claspは野良GASの夢をみるか
takter00
0
210
ECSアプリログをFireLensでコスト削減しようとしたけど諦めた話 in Fargate×Node.js
akihisaikeda
2
4.2k
New "Type" system on PicoRuby
pocke
1
1k
技術的負債解消で開発者の未来を開く- AIの力でコード刷新
kmd2kmd
0
120
並列実装の現場、2ヶ月間実務でAIを使い倒したAIもPCも私も限界が近い
ming_ayami
0
130
Datadog × OpenTelemetry 入門と実践のあいだ
kn_to_maxpno
1
180
1B+ /day規模のログを管理する技術
broadleaf
0
110
Spring Security 実践 ─ GraphQL APIで実務に役立つ 認証・認可 を学ぶ
wagyu
0
260
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
740
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
1
300
Featured
See All Featured
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.1k
The Language of Interfaces
destraynor
162
27k
Designing for Performance
lara
611
70k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
170
It's Worth the Effort
3n
188
29k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.3k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.2k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Ethics towards AI in product and experience design
skipperchong
2
310
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
2
870
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
5.9k
30 Presentation Tips
portentint
PRO
1
330
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 ॳֶऀͷʹܦ͍ͯͰ͢
͝ਗ਼ௌ ͋Γ͕ͱ͏͍͟͝·ͨ͠