はじめに
本記事は Android 初心者 Advent Calendar 2018 13日目の記事です。
Android開発を初めて1ヶ月ほどがたったころ、
会社で以下の話が持ち上がりました。
開発しているアプリがレガシーなので構造を新しくしよう!
そこで、ここ2ヶ月くらい調べたり勉強したりしていた結果をサンプルアプリにまとめて見ました。
これを元に、どういう構造にしていくか、
どう変えていったらよいかをチーム内で会話していく予定です。
動作確認バージョン
-
Win
Android studio 3.2.1
Windows10 Home Version:1803 -
Mac
Android studio 3.2.1
Mac OS Mojave 10.14.1
アプリの構造
-
以下のデザインパターン使用する
MVVM -
以下のライブラリを使用する
- RxJava2(RxBus)
- RxAndroid
- room
- Data Binding
前提条件
このまま本番コードにするわけではないです
あくまでチーム内で議論するためのサンプルです。
サンプルの目的
神Activity(Fragment)からの脱却
- いま業務で開発しているアプリは神Activity(Fragment)過ぎてツライ
- Activity(Fragment)の継承地獄
- 密結合過ぎてテストを書くのがツライ
Nullpo対策
アプリがライフサイクルについていけず、よく死ぬ。
安心したい。
もっとレガシーに愛を
ネットにあるサンプルはkotlin、RetroLambda使用前提のコードばかり。
Java1.7までしかしらないけどRxJavaとかを使いたい人向け。
(もちろんkotlinにしたいが現実的にはコストや品質面で難しい…)
勉強しろ!という話はごもっとも…。
でも勉強するのが目的ではないので、
とりあえず分かるもの、動くもの、今の知識でも勉強できるものがあれば嬉しいと思います。
自分の勉強結果のアウトプット
強いAndroidエンジニアの人からマサカリ貰えたら嬉しい。
アーキテクチャや考え方の部分は、独学キツイので良さげな仕組みがあったら知りたい…。
その他、悩んでいる点
-
データソース(ファイル、DB)をラップするためにRepositoryパターンにした方が良いか?
いまのところsqliteだけだし、roomのままで良いかなぁと思っている。
たぶん切り替えるのもそんなに辛くないハズ…。
あまり最初から盛りすぎると硬直する気もしている。 -
dagger2の利便性がわからず使えていない
ちょっと勉強したりもくもく会で聞いてみたけど、
イマイチ使う嬉しさがわからない…。
困っていることに気づいていないだけっぽい?
具体的なソースコードとかあると嬉しい。 -
他の機能に対する問題の有無を検証できていない
課金機能、GoogleMapの埋め込み、カメラ機能などに対してこの仕組みで良いかは未検証。
どうとでもなりそうな気はするし進めちゃって良い気もするけど、
可能なら先に検証しておきたい。
作成したサンプルアプリのソース
ソースは以下のGithubからどうぞ。
https://github.com/fortegp05/SampleAndroidApps
アプリに実装した機能
-
非同期通信機能(RxJava2(RxBus)、RxAndroid)
Githubのリポジトリを検索して一覧表示する機能
connpassのイベントを検索して一覧表示する機能(Apiが重くてよくタイムアウトする) -
roomによるSQLiteの操作
SQLiteにデータ保存する機能
SQLiteからデータを取得して表示する機能 -
Data BindingによるViewとViewModelの連携
-
Navigation Drawerの実装
-
テストの実装
- 単体テスト
- UIテスト
今後やっていきたい内容
- さらなるモダン化
- kotlin化
- RetroLambdaの使用
- 機能拡張
- 検索時に任意の文字列を渡す部分をData Bindingで双方向にする
- リアルタイム検索とか
- RecyclerViewのスクロール時に次のデータを取ってくる
- SQLiteの操作追加
- 更新
- 削除
- 検索時に任意の文字列を渡す部分をData Bindingで双方向にする
おわりに
次回から実際にコード例を上げつつ、やったことをアウトプットしていきます。
次はRxJavaによる非同期処理の解説にチャレンジしてみる予定。