Blog
「チームで育てるAndroidアプリ設計」を読んで、アーキテクチャの育成について考える

この記事はPRです。

@mhidakaさんからお声がけ頂き、先日発売された横幕 圭真さんと釘宮 愼之介さんの本「チームで育てるAndroidアプリ設計」をレビューすることになりました。

私なりに読んで感じたこと、そして自分のアーキテクチャの育成に対する考えを書きたいと思います。

続きを読む
launchWhenXXとrepeatOnLifecycleの違い【Android / Kotlin Coroutines】

このブログでは度々お伝えしていますが、Kotlin Coroutinesは非同期処理を強力に支援してくれます。

特に、値を複数回送受信することができるFlowの強化により、Kotlin Coroutinesの表現力がより一層向上し、一部LiveDataやRxJavaから移行する動きもあります。

一方で、AndroidのLifecycleを考慮し、非同期処理を安全に利用するためには、いくつか注意する必要があります。

今回は、以前からあるlaunchWhenStartedやlaunchWhenResumed等のlaunchWhenXX系と、lifecycle-runtime-ktx:2.4.0-alpha01で追加されたrepeatOnLifecycleの違いと使い分けについて紹介します。

続きを読む
LiveData vs Flow vs RxJava

Kotlin Coroutinesの進化はすざましく、とどまるところを知りません。

状態やイベントを扱いやすくなったStateFlowやSharedFlowが登場し、さらには、Lifecycleをより扱いやすくなったLifecycleOwner.addRepeatingJobやLifecycleOwner.repeatOnLifecycle、Flow.flowWithLifecycleが追加されました。

RoomやDataStore等Jetpackの各種ライブラリでもCoroutinesが使われており、Jetpack Composeでも様々なところでCoroutinesが活用されています。

そういった中で、一部LiveDataやRxJavaからCoroutinesに書き直す動きが見られ、多少混乱を招いていると感じています。

結論から言うと、現時点において積極的にCoroutinesに移行する必要性はないと考えています。

今回は、それらを比較しつつ、どういった使い分けをするのが好ましいのか私の視点からまとめます。

続きを読む
【Android】アニメーション付きBindingAdapterを作る

Jetpack Composeのβ版が公開され盛り上がりを見せていますが、まだまだAndroidでViewを作成する際はDataBindingが主流でしょう。

DataBindingはxml内でコードを参照することでアプリのデータとUIを同期することができ、MVVMのアーキテクチャでより威力を発揮します。

BindingAdapterを使うことで、独自のプロパティを作成することも可能です。

これらは非常に便利なツールですが、アニメーションを扱う上ことは若干苦手とします。

今回はアニメーション付きのBindingAdapterを作るときの注意点と、その解決方法について紹介をします。

続きを読む
ZennでKotlin Coroutinesの本を公開しました!【目次あり】

Zennというサイトで、「詳解 Kotlin Coroutines [2021]」という本を公開しました。

これまでブログに載せてきた情報に加えて、Kotlin Coroutinesを体系的に学べるようまとめてあります。

1, 2章は無料公開しているので、ぜひご覧ください。

2021年2月28日まではセールで少しお安くお買い求め頂けます。

続きを読む
2020年のAndroidアプリ開発の変化を振り返る

2020年ももうすぐ終わりですね。

今年は本当に激動の1年でした。

Androidアプリ開発においても、1年経てば色々と環境が変わってきます。

今年出た技術や注目された技術について、私なりの視点で解説していきたいと思います。

続きを読む
【Kotlin】suspend functionとテストの書き方

この記事は Kotlin Advent Calendar 2020の15日目の記事です。

非同期処理を書く際に、kotlin coroutinesは使いやすく、非常に強力です。

一方で、単体テスト等を書くのには一定のハードルがあります。

今回は、suspend functionをテストしたり、モックする方法について紹介します。

続きを読む
【Android】新旧アーキテクチャが混ざるプロジェクトで気をつけていること

この記事はCyberAgent Developers Advent Calendar 2020の6日目の記事です。

ある程度の歴史の長いプロジェクトでは、リアーキテクチャやアーキテクチャのブラッシュアップ等により、複数のアーキテクチャが混ざるということが多々あると思います。

私もAndroidアプリにおいてMVCからMVVM、javaからkotlinへの段階的リアーキテクチャを進めています。

その中で一番重要なのは、 新アーキテクチャの実装/設計を旧アーキテクチャに依存させないことだと感じています。

今回は、それを実現するためのいくつかの工夫について紹介したいと思います。

続きを読む
kotlin coroutinesでViewModelからViewにイベント通知したい

この記事はAndroid Advent Calendar 2020の2日目の記事です。

SharedFlowやStateFlowの登場により、ますますkotlin coroutinesを手軽に扱えるようになってきました。

AndroidのMVVMにおいても、LiveDataの代わりにStateFlowを使ってViewとViewModelをbindingすることが可能になりました。一方で、ViewModelからViewに状態ではなくイベントを送るのは未だいくつかの問題があります。

今回は、複数の方法をメリットデメリットとともに紹介したいと思います。

続きを読む
StateFlowの深堀り、SharedFlowとの違いとstateIn【kotlin coroutines flow】

StateFlowはkotlin corouteinsの1.3.6で追加された状態管理用の特別なFlowです。

以前、「StateFlowのドキュメントを読み込む」という記事を書きましたが、その後SharedFlowが追加され、若干実装に変更がありました。

また、新たにstateInというoperatorも追加されています。

今回はそれらを含めたStateFlowの詳細な仕様に関して深堀りしていきたいと思います。

続きを読む
GASで記念日通知 slack botを作ろう

突然ですが、2020年11月6日に入籍しました。

結婚記念日やその他記念日を忘れると、怒られが発生するので、記念日当日にslackに通知してもらいましょう。

今回はGAS(Google Apps Script)を使っていきます。

続きを読む
SharedFlowの深堀り、replay, bufferって何【kotlin coroutines flow】

SharedFlowはkotlin corouteinsの1.4.0-M1で追加された新しいFlowです。

以前、Flow, SharedFlow, StateFlowの比較を行いました。

今回はSharedFlowの詳細な仕様に関して深堀りしていきたいと思います。

続きを読む
kotlin coroutinesのFlow, SharedFlow, StateFlowを整理する

JetpackでもRoom, Paging 3, DataStore等様々なライブラリがkotlin coroutines flowを使い始め、もはやAndroid開発にはflowが必要不可欠になってきました。

そんな中、以前紹介したStateFlowに加えて、SharedFlowが1.4.0-M1から登場しました。

少し複雑に感じますが、実はかなり整理されており、以前より使いやすくなっていると思っています。

今回は、Flow、SharedFlow、StateFlowの概要に関して紹介し、各々の詳細に関しては別途まとめたいと思います。

続きを読む
ViewModelでString resourcesを扱いたい

Androidで開発する際、文字列のリソースは res/values/strings.xml に書いて管理すると思います。

それらを実際に文字列として取得するためには、contextが必要になります。

一方で、ViewModelにActivity contextを渡すことはメモリリークの危険性があるため、アンチパターンとされています。

Application contextで文字列を取得する方法もあると思いますが、言語切替時に正しくUIが更新されない等、あまり良くないと感じました。

ViewModelではenum等を作成し、View側で文字列に変換する等の方法もあると思いますが、細かい文字列の制御が難しくなります。

今回はActivity contextを使いつつ、いい感じにString resourcesを扱う方法について紹介したいと思います。

続きを読む
OnLifecycleEventより、DefaultLifecycleObserverを使おう

Androidの複雑なlifecycleに対応するのに、jetpackのLifecycleObserver等の仕組みは非常に強力です。

LifecycleObserverにはいくつか種類がありますが、LifecycleObserverのinterfaceにOnLifecycleEventのアノテーションを付けてやる方法が一番一般的だと思っていました。

しかし、java 8環境下ではDefaultLifecycleObserverのほうが強く推奨されていたので、その説明と、移行に関する注意点をまとめてみます。

続きを読む