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
ViewModel使ってますか?
Search
katsuki-nakatani
April 26, 2018
Technology
340
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ViewModel使ってますか?
メルカリさん、ヤフーさん主催のMixLeapでLTしたときの資料です。
AndroidのViewModelのさわりの説明というかんじです
katsuki-nakatani
April 26, 2018
More Decks by katsuki-nakatani
See All by katsuki-nakatani
Android 10 対応 Tips
katsukinakatani
0
130
InAppUpdate実装&InAppBillingClientVer2.0実装例
katsukinakatani
0
640
AndroidJetpack概要 &旧AACの紹介
katsukinakatani
0
740
デフォルトアプリとパーミッション
katsukinakatani
0
230
Target SDK Version 26に上げる時につまづいたこと
katsukinakatani
3
2.9k
Whats new android wear (umeda.apk #3 LT)
katsukinakatani
1
520
Android 7.1.1 AppShortcuts setup(DevfestKansai Lightning Talk)
katsukinakatani
1
730
Firebase Authentication & Firebase Realtime Database setup
katsukinakatani
2
930
Firebase Setup for Android Studio2.2
katsukinakatani
1
650
Other Decks in Technology
See All in Technology
公共分野での生成AI活用
toru_kubota
1
310
増え続けるプロダクトの品質をどう担保するか。ProductSpecとTypeScriptによる取り組み
joere
3
1.6k
[JAWS Festa 2026]一番いい仕事は、請求書に現れない / jawsfesta2026
sh_fk2
2
420
AI時代の組織作り:チーム開発から「個人×AI」への移行と、持続可能な「開発資本」の築き方
ham0215
2
420
AI時代における医療情報システムのセキュリティ / Security of Healthcare IT Systems in the AI Era
henryofficial
0
120
Context Ontology Accelerator 入門 (業務データの意味を、AI エージェントに渡す)
inariku
PRO
3
590
re:Invent2026 事前勉強会 歴史と愉しみ方10分LT編
toshi_atsumi
0
170
PostgreSQL オプティマイザ統計の秘密
nori_shinoda
1
440
HQ駆動開発で最高のAI-Contextを作ろう
sansantech
PRO
1
120
仕様と現実の間で落とし所を探るリモートMCPの認証・認可 — Sansanの認証基盤における課題と実践
sansantech
PRO
2
180
BALLAS Technology Deck
ballas_inc
0
350
慶應義塾大学 AI実践05 論文執筆の仕組み化
keio_smilab
PRO
7
3.8k
Featured
See All Featured
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
4
4.4k
We Are The Robots
honzajavorek
0
440
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
74
43k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
121
130k
The Limits of Empathy - UXLibs8
cassininazir
2
770
A Soul's Torment
seathinner
8
3.9k
A Tale of Four Properties
chriscoyier
163
24k
HDC tutorial
michielstock
2
1k
Intergalactic Javascript Robots from Outer Space
tanoku
273
28k
Fireside Chat
paigeccino
43
4.1k
Code Reviewing Like a Champion
maltzj
529
40k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Transcript
ViewModel使ってますか? 2018/4/20 Osaka Mix Leap Study #11 - スマホアプリ勉強会
Speaker 中谷 克紀 仕事 Enterprise Server Engineer GDG 神戸スタッフ Twitter @KatsukiNakatani
What's ViewModel? MVVMとか設計の話ではないです
これの話
ViewPagerでこんなデータを表示したい 仮想通貨のデータ 最近、仮想通貨流行ってますよね?
データの持ち方 data class CurrencyOrder( var exchanger: String? = null, //購入Exchanger
var folio_group:Long = FolioGroup.DEFAULT_ID, //この通貨のグループ var currency_pair: String? = null, //通貨ペア var proc_date: String = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd")), //処理日付 var amount: Double = 0.toDouble(), //処理数量 var price: Double = 0.toDouble() //ベースとなる通貨の価格 exchanger folio_group currency_pair proc_date amount price zaif 1 jpy_btc 2018/1/1 1 850000 zaif 2 jpy_xem 2018/2/2 1 35
データの概要 folio_groupがここ
安易に考える Activity ViewPager Pager1 Fragment Pager2 Fragment ActivityViewModel FragmentViewModel FragmentViewModel
安易に考える Activity ViewPager Pager1 Fragment Pager2 Fragment ActivityViewModel 1.ActivityViewModelがデータを全件取得 2.ActivityがそのデータをDataCallbackInterfaceを
実装しているであろう Fragmentに送る 3.FragmentがCallbackを受け取り、データを表示 FragmentViewModel FragmentViewModel DataCallback DataCallback
めんどくさい Activity ViewPager Pager1 Fragment Pager2 Fragment ActivityViewModel ・ActivityがDataCallbackInterfaceを実装していることを知る必要あり ・ActivityはただViewPagerだけ管理していたい
FragmentViewModel FragmentViewModel DataCallback DataCallback
ViewModelの登場 ViewModelのインスタンス生成時に渡すparameterに 紐付いて生存期間のスコープが作成されます ViewModelProviders.of(parameter).get(MyViewModel.class); 画面回転時にデータ保存を意識しなくても良い!! ※ただし低メモリ時に破棄されると困るデータはきちんと SaveInstanceStateで保存しましょう
ViewModelの共有 ViewModelのインスタンス生成時に渡すparameterが同じものは別インスタンスじゃなくて 同じインスタンスにアクセスできる ViewPager Fragment Code viewModel = ViewModelProviders.of(activity).get(AssetsViewModel::class.java) Activity
ViewPager Pager1 Fragment Pager2 Fragment getActivity()した結果は同じActivity
諸問題が解決 Activity ViewPager Pager1 Fragment Pager2 Fragment ActivityViewModel AssetViewModel DataCallback
DataCallback ・DataCallbackを用意しなくても良くなり、 ActivityがFragmentの実装を意識しなくて良くなった ・Activityの回転時に再度データを検索、表示するような実装を意識しなくても良くなった
ViewModelの作り方 class AssetsViewModel @Inject constructor(private val database: AppDatabase, private val
messageRepository: MessageRepository, private val assetRepository: AssetsRepository, private val preferenceRepository: PreferenceRepository) : ViewModel() Architecture ComponentのViewModelを継承する
注意すること 生存期間が渡したパラメータのライフサイクルより長い = ViewModel側でViewにアクセスする、またはライフサイクル内の コンテキストを使用するような実装は避けましょう contextがほしいViewModelの場合はAndroidViewModelを 継承してください
ViewModelはLiveDataと組み合わせると便利 LiveDataの特徴 SubscribeするとActivityやFragmentのライフサイクル状態を 見てコールバックを呼び出してくれる LiveDataの定義 var assetsList: MutableLiveData<AssetsResponse> = MutableLiveData()
LiveDataへデータのプッシュ assetsList.postValue(response) viewModel.assetsList.observe(this,Observer<AssetsResponse> { it -> //表示処理}) LiveDataのオブザーブ ViewModel Fragment
よくある通信例 1.画面を開くと外部通信を行う 2.外部通信を行っている場合はProgressが表示される 3.通信を行っている間に画面が回転する可能性もある 4.通信結果を画面に表示する、ただし画面を落としている可能性もあるよね 落としている時はデータ表示処理してほしくないし復帰したら処理してほしい
よくある通信例 1.画面を開くと外部通信を行う 2.外部通信を行っている場合はProgressが表示される 3.通信を行っている間に画面が回転する可能性もある 4.通信結果を画面に表示する、ただし画面を落としている可能性もある 落としている時はデータ表示処理してほしくないし復帰したら処理してほしい ー>ViewModelにbooleanを持ってDatabindingで表示・非表示を切り替え ー>ViewModelを使えば渡すContextより長いスコープで 生存してくれるので気にしなくて良い ー>LiveDataをViewModel内に持たせておけば、回転してもデータを維持しUI復帰時に
データをPostしてコールバックしてくれる
使ってみた https://goo.gl/NB9R7y 結果・Room+ViewModel+LiveDataを使って実装してみたのでよければ使ってください。 Architecture Componentのモジュールを使うと 今まで苦労していたAndroidのライフサイクル関係は 大分楽に実装できます
おしまい 御清聴ありがとうございました