Blog
ブログをNext.js(SSG)に移行しました

このブログはReactで1から作成しており、CSR (Client Side Rendering) として実行してました。

この度、Next.jsのSSG (Static Site Generation) を導入してみたので、その報告になります。

続きを読む
Kotlin Coroutinesでフォアグラウンドになるまで待つ【Android】

Androidアプリ開発において、Lifecycleを考慮することでユーザのリソースを有効的に利用することが出来ます。

ユーザのリソースを不要に消費しないようにするためには、必要になったときに必要な処理を行うことが重要です。

バックグラウンド時や他画面を開いているときAPIを叩く必要性が出てきても、LifecycleがSTARTEDになるまで待つべきでしょう。

今回は、Kotlin Coroutinesを用いて、LifecycleがSTARTED、すなわちフォアグラウンドになったときにAPI等を叩くような処理について考えてみます。

続きを読む
Kotlin Coroutinesで共有リソースを扱う

Kotlin CoroutinesをUIスレッド(Dispatchers.Main)のみで使っている場合、単一のリソースを複数Coroutinesで扱った場合でも問題が発生することはほとんどありません。

一方で、バックグラウンドスレッドを含めた複数スレッド(Dispatchers.Default, Dispathcers.IO)で単一のリソースを共有した場合は、競合が発生し予期せぬ不具合を引き起こす可能性があります。

今回はその危険性と解決方法について紹介します。

続きを読む
LiveDataからCoroutines Flowへ移行する

以前「LiveData vs Flow vs RxJava」という記事で紹介したとおり、LiveDataは非常にシンプルで、現在でもベストプラクティスであることは間違いないでしょう。

一方で、既に多くの箇所でCoroutinesを導入していたり、Coroutinesが使いやすいと感じている場合、LiveDataからCoroutinesのFlowに移行することも選択肢の1つでしょう。

CoroutinesはLiveDataより複雑で、様々なオプションを提供してくれているため、利用に戸惑うこともあると思います。

今回は、LiveDataが利用されていたようなケースでCoroutines Flowを使う場合どうしたらいいのか、細かい差分についても紹介をしていきます。

続きを読む
Android 12で変わったActivityのLifecycleの話

Android 12ではMaterial Youが採用されたり、スクロールのエフェクトが変わったり、スプラッシュ画面がついたりと、UI周りの変更が多く見られました。

その裏で、セキュリティやパフォーマンス等に関する内部的な変更もいくつか存在します。

今回はその中から、ActivityのLifecycleに一部変更があった点について紹介を行い、また開発者が気をつけるべき点について解説します。

続きを読む
Jetpack Composeでレスポンシブ対応なら、BoxWithConstraintsが便利

Jetpack Composeを使うことで、今までのxmlベースの実装では対応が難しかったいくつかの内容に対して、実装が容易になることがあります。

その1つがレスポンシブ対応です。

タブレット端末も含めると大小様々な画面サイズのデバイスがあり、また分割画面も考慮すると、対応すべき画面サイズは膨大なものになっています。

最近は折りたたみスマートフォンも増えてきましたね。

xmlベースでのUI構築では、xmlを分けるか、ゴリゴリコードを書いて命令的に更新する必要がありました。

Jetpack ComposeはBoxWithConstraintsを使うことで簡単に対応することが出来ます。

今回はその使い方について紹介します。

続きを読む
Jetpack ComposeとViewModelについて考える

Jetpack Composeの導入は、アーキテクチャについて再検討する良い機会でしょう。

GoogleはAndroid Architecture Components(AAC)のViewModelとJetpack Composeを結合する方法を解説しており、今まで通りのViewModelが利用できるとしています。一方でTwitter等ではViewModelは不要になるのでは?といった議論もされてきました。

結論から言うと、Jetpack Composeの導入によってViewModelの形や名称は変化する可能性はあるが、関心の分離の観点からUIとロジックの分離は依然として重要であり、今後もViewModelに相当するものは無くならないでしょう。

今回はJetpack Comopseを使う上で、ViewModelをどのように扱うのが良いのか、どのように変化する可能性があるのか、いくつかの考察を行ってみたいと思います。

続きを読む
Jetpack Composeのコンポーネントはなぜ返り値がないのか

先週、「Jetpack Compose, React, Flutter, SwiftUIを比較する」という記事で宣言的UIの各ツールの比較を行いました。

その中で、Jetpack Compose特有の特徴としてコンポーネントに返り値がないことを紹介しました。

これは、React等で遵守されてきたコンポーネントは純粋関数として扱うというルールから逸脱したものとなります。

その理由について、Jetpack Composeの開発に携わるJim SprochさんからTwitterでリプライを頂きました。

今回はその内容について1つずつ深堀りしていきます。

続きを読む
Jetpack Compose, React, Flutter, SwiftUIを比較する

宣言的UIの考え方はReact、Flutter、SwiftUI、Jetpack Composeと広がり、ほぼ全てのプラットフォームで利用できるようになりました。

今までのHTMLやXMLに対して命令的に処理を書くのに対し、宣言的UIはUIの構築や更新を圧倒的に簡素にしてくれます。

また、差分更新の仕組みを備えているものも多く、パフォーマンスの向上も見込めます。

今回はいくつかある宣言的UIのツール群の中から、代表的なJetpack Compose、React、Flutter、SwiftUIを個人的な見解も含めて比較していきます。

続きを読む
MVVMでモデルに処理を寄せる【Android】

Androidアプリ開発を行う際、公式も推奨しているViewModelを使ったアーキテクチャを採用することが多いと思います。

ViewからViewModelに処理を移動させていくと、Viewに全てを書くよりは幾分かマシになります。

一方、アプリケーションが複雑になっていくと、今度はViewModelが肥大化するという問題に直面するでしょう。

この問題は様々な要因が考えられ、解決は容易ではありません。

私自身、いつも頭を悩ましながら、コードの整理に努めています。

今回は、私が最近試みた中で比較的うまく行っている方法の中から、Modelに処理を寄せる話と、UseCaseレイヤーの話を、コードの例を交えながら紹介します。

続きを読む
「チームで育てる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日まではセールで少しお安くお買い求め頂けます。

続きを読む