技術的負債に向き合う
God Class
→FatActivity
→Delegate
- 実装の共通化
- 実装の強制は
abstract
よりもinterface
で - 継承を使う場合は
is-a
を意識する
Androidアプリ開発におけるMVVMアーキテクチャ
- Viewとロジックを明確に分離する手段としてアーキテクチャを使う
- privateな
mutavleLiveData
とpublicなLiveData
- 今はAndroidXとDataBindingを利用したMVVMがおすすめ
ライフサイクル生存戦略
Jetpack Lifecycle
を利用することで、Activity/Fragmentからライフサイクルステータスの変化に対応するための処理を分離できる- Lifecycleで実行できるのは、Activityで定義されているものだけ。
onViewCreated
のようなFragment特有なものは用意されていない - Activityの再生成に対応する場合は
onSavedInstanceState
を利用する。これはViewModelでも利用できる。
ライルサイクルをコントロールするLiveDataとViewModel
LiveData
はライフサイクル的にアプリがアクティブの場合のみpublishするデータホルダーViewModel
はActivityのonCreateからfinishまで生存するオブジェクト。onSavedInstanceState
よりも柔軟かつ高速にデータの読み書きができるが、プロセスの終了には対応できないので使い分けが重要。ViewModelStoreOwner
に親Activityを指定することで、異なる子Fragment同士でFragmentのライフサイクルを気にせずにデータの共有が可能- ViewModelはデータではなくデータソースを持つ。その際
MediatorLiveData
,Transformations
などの便利クラスも活用すべし
コルーチンとアーキテクチャ
- コルーチンスコープ単位でキャンセルや例外補足が可能
- コルーチン内で発生したレスポンスはResult型で表現すると便利
- asyncは返却する。launchは値を返却しない。joinでlaunchの終了を待てる
- withContextでスレッド制御
- applicationScopeでviewModelのライフサイクルから外れた制御もできる
ビルド速度を改善したいけど何をすればいいの
- Build Analyzerで各工程ごとのビルド時間の計測が可能
- Android Gragle pluginはビルド速度改善のアップデートが多いため、最新版の利用を推奨
- Gradleデーモンに割り当てるメモリ
- ビルドのオフラインモード
メモリリークの謎を追う
- rxjavaの非同期通信でviewの参照を持ったときはdisposableのclear()を利用する。それか github.com を活用
- LiveDataをViewから購読するようにすることで参照方向を逆転できる。
- AlertDialogはactivityのcontextを利用すると画面回転などの対応ができないため、DialogFragmentのcontextを利用する
- FragmentManagerが持つFragment参照とViewのライフサイクル。今まで意識してなかったのでbindingをlateinitで宣言してた。業務で色々改善できそう
- Bitmapの直接の利用は極力避け、Glideなどのライブラリやurlなどの参照形式で代替できないか検討する
- LeakCanaly,strict mode
感想
感覚的には、知っていることが5割、知識の整理につながったのが4割、完全新規で得られた情報が1割くらい。
ある程度知識がついてくると初級者向けの書籍などはコスパが悪くなってくるし、かと言って最新のドキュメントを追い続けるのも最近は時間的にしんどい。そういった意味でこの書籍は今のAndroid開発を俯瞰して確認できてありがたかった。
個人的に今後Androidの最新情報を得る手段としては、日々の業務での調査+信頼できる人たちが書いた技術書展系の書籍でdiffの取り込みを繰り返すのがちょうど良さそう。
技術同人誌にかけるお金を少し増やしていこうかなと思えた一冊だった。