ZennでKotlin Coroutinesの本を公開しました!【目次あり】
Zennというサイトで、「詳解 Kotlin Coroutines [2021]」という本を公開しました。
これまでブログに載せてきた情報に加えて、Kotlin Coroutinesを体系的に学べるようまとめてあります。
1, 2章は無料公開しているので、ぜひご覧ください。
2021年2月28日まではセールで少しお安くお買い求め頂けます。
Zennというサイトで、「詳解 Kotlin Coroutines [2021]」という本を公開しました。
これまでブログに載せてきた情報に加えて、Kotlin Coroutinesを体系的に学べるようまとめてあります。
1, 2章は無料公開しているので、ぜひご覧ください。
2021年2月28日まではセールで少しお安くお買い求め頂けます。
複雑化するmobileアプリにおいて、アプリ内の状態をどう整合性を保って保持するかという議論は非常に重要です。
特に、画面を跨いだときにどうデータを同期するかは難しく、少し間違えば結合度が高く、メンテナンス性が低いコードになりがちです。
例えば、twitterのような一覧画面と詳細がある場合に、詳細画面で行った「いいね」を、どうツイート一覧画面に反映させるかという問題です。
いわゆる「いいねボタン問題」と呼ばれているものです。
最近では、OR MapperのRoomにて、内部の状態をLiveDataやFlowで出力することで、解消しているケースを多く見かける気がします
一方、永続化する必要がない、一部のデータのみをやり取りしたい等の理由で、この手法を採用できないケースも多々あると思います。
今回は、roomを使わず、kotlin coroutines flowをふんだん使って、柔軟に対応できる設計を紹介したいと思います。
2020年ももうすぐ終わりですね。
今年は本当に激動の1年でした。
Androidアプリ開発においても、1年経てば色々と環境が変わってきます。
今年出た技術や注目された技術について、私なりの視点で解説していきたいと思います。
Kotlin Android Extensionは現在2つ機能があり、findViewByIdを省略できるviewsとParcelableの実装を楽にしてくれるparcelizeがあります。
特に viewsは非常に便利で、僕自身もよく使っていました。
一方、ViewBindingというものも登場し、DataBindingの軽量版みたいな立ち位置で、こちらもfindViewByIdを省略することができます。
Kotlin Android ExtensionとViewBinding、DataBindingを比較し、使い分けについて議論したいと思います。
この記事はCyberAgent Developers Advent Calendar 2020の6日目の記事です。
ある程度の歴史の長いプロジェクトでは、リアーキテクチャやアーキテクチャのブラッシュアップ等により、複数のアーキテクチャが混ざるということが多々あると思います。
私もAndroidアプリにおいてMVCからMVVM、javaからkotlinへの段階的リアーキテクチャを進めています。
その中で一番重要なのは、 新アーキテクチャの実装/設計を旧アーキテクチャに依存させないことだと感じています。
今回は、それを実現するためのいくつかの工夫について紹介したいと思います。
突然ですが、2020年11月6日に入籍しました。
結婚記念日やその他記念日を忘れると、怒られが発生するので、記念日当日にslackに通知してもらいましょう。
今回はGAS(Google Apps Script)を使っていきます。
Androidで開発する際、文字列のリソースは res/values/strings.xml に書いて管理すると思います。
それらを実際に文字列として取得するためには、contextが必要になります。
一方で、ViewModelにActivity contextを渡すことはメモリリークの危険性があるため、アンチパターンとされています。
Application contextで文字列を取得する方法もあると思いますが、言語切替時に正しくUIが更新されない等、あまり良くないと感じました。
ViewModelではenum等を作成し、View側で文字列に変換する等の方法もあると思いますが、細かい文字列の制御が難しくなります。
今回はActivity contextを使いつつ、いい感じにString resourcesを扱う方法について紹介したいと思います。
Androidの複雑なlifecycleに対応するのに、jetpackのLifecycleObserver等の仕組みは非常に強力です。
LifecycleObserverにはいくつか種類がありますが、LifecycleObserverのinterfaceにOnLifecycleEventのアノテーションを付けてやる方法が一番一般的だと思っていました。
しかし、java 8環境下ではDefaultLifecycleObserverのほうが強く推奨されていたので、その説明と、移行に関する注意点をまとめてみます。
Navigation Componentの登場により、画面遷移をFragmentベースで行う例が増えてきたように思います。
Fragmentで画面遷移をさせることで、toolbarやbottom navigation view等の共通のUIを表示し続けられるようになったり、activityでの画面遷移よりパフォーマンスがよかったり、いくつかの利点があります。
一方で、activityでの画面遷移とは違い、navigation利用時は遷移時にデフォルトのアニメーションがつきません。
そこで、今回はいくつかの遷移アニメーションの例を提示したいと思います。
Androidに置いてアクセシビリティの観点からボタンのサイズは縦横共に最小48dpを推奨されています。(iOSは44pxみたいです)
また、デザイン上そのサイズに満たない場合でも、その周りもタッチできることが求められています。
今回はそれの具体的な実装方法について紹介したいと思います。
fragmentが難しい理由の一つとして、viewの生存期間よりfragmentの生存期間のほうが長い、というところがあると思います。
そのため、viewが再生成された際に正しく新しいviewを参照できなかったり、viewへの参照が切られずメモリリークしたりということがよく起きます。
今回はviewへの参照をby lazyの形で安全に書ける仕組みを考えてみたいと思います。
androidアプリでは、activityの背景を透明にすることで、dialogのように扱ったり、様々なUI表現をすることができます。
最近はFragment周りの環境が整ってきた影響であまり使われなくなってきた印象がありますが、まだまだ使っているプロジェクトもあるのではないかと思います。
透明activityを使った場合、実はactivityのlifecycleが通常とは異なる動作をしており、少し詰まったのでまとめます。
サーバ間、サーバとクライアント間の通信でgRPCを採用することは、様々なメリットがあります。
AndroidでもgRPCの採用事例が増えてきたように思います。
以前はgrpc/grpc-javaを使ってstubを生成してたと思うのですが、いつの間にかgrpc/grpc-kotlinも出ていました。
しっかりとkotlin coroutinesをサポートしており、かなり便利だったので、導入方法を紹介します。
最近のandroid開発において、複雑なlifecycleに対応するのにLiveDataは重要な役割を果たすことが多いです。
その他のstream系ライブラリと比べても非常にシンプルで、初心者でも比較的親しみやすいと思います。
一方で、意外なところで躓くことも多いのが実情かと思います。(経験談)
今回はHot, Coldの話を主軸に、LiveDataの躓きやすいポイントについて触れたいと思います。
CyberAgentにエンジニアとして新卒入社して1年が経ちました。
僕は今、 OPENREC.tvのAndroidアプリ開発を担当しています。
この1年、kotlinを導入したり、MVCからMVVMにリアーキテクチャしたり、デザインリニューアルをリリースしたりと、非常に忙しく動き回っていました。
そして非常にありがたいことに、技術者による技術者のための社内表彰「CA BASE AWARD 2020」において、ベストルーキー賞を頂きました。
一方で、僕が何をやっていたのか、多くの人はあまり知らないと思い、また今後自分が見返すためにも、この1年間やってきたことをまとめたいともいます。