Blog
kotlin coroutines flowをlifecycle scopeで安全に扱う

以前、kotlin coroutines flowを使って、LiveDataを使わずMVVMを行う方法について書きました。

その後、StateFlowも登場し、ますますLiveDataの代わりに、kotlin coroutinesを使う手法が確立してきたように感じます。

Flowをactivityやfragmentで安全にcollectするためには、lifecycle scopeを使う必要があります。

しかし、lifecycle scopeは通常のcoroutines scopeにいくつかメソッドが追加されており、少し複雑です。

今回はflowをlifecycleScopeで安全に使う方法について考えます。

続きを読む
未踏を振り返る

2019年度未踏事業を終え、先日スーパークリエータに認定して頂きました。

いい機会なので、未踏に参加した背景から追えての感想まで、一通り振り返りたいと思います。

続きを読む
本当は怖い。透明activityのlifecycleの罠。

androidアプリでは、activityの背景を透明にすることで、dialogのように扱ったり、様々なUI表現をすることができます。

最近はFragment周りの環境が整ってきた影響であまり使われなくなってきた印象がありますが、まだまだ使っているプロジェクトもあるのではないかと思います。

透明activityを使った場合、実はactivityのlifecycleが通常とは異なる動作をしており、少し詰まったのでまとめます。

続きを読む
kotlin coroutinesのStateFlowのドキュメントを読み込む

kotlin coroutines 1.3.6にて、StateFlowというものが導入されました。

状態管理のために用いられる型で、将来的にConflatedBroadcastChannelから置き換わるとも言われています。

今回は、ドキュメントを詳しく見つつ、実際にコードを動かして特徴について見ていきたいと思います。

続きを読む
androidでgrpc-kotlinを使う

サーバ間、サーバとクライアント間の通信でgRPCを採用することは、様々なメリットがあります。

AndroidでもgRPCの採用事例が増えてきたように思います。

以前はgrpc/grpc-javaを使ってstubを生成してたと思うのですが、いつの間にかgrpc/grpc-kotlinも出ていました。

しっかりとkotlin coroutinesをサポートしており、かなり便利だったので、導入方法を紹介します。

続きを読む
kotlin coroutines flowでMVVMを試した(LiveDataを使わない)

LiveDataは非常に便利ですが、以前も書いたとおり、hotとcoldがわかりにくい、内部がjavaのためnon nullを扱いにくい等、ところどころ不自由な点があります。

また、kotlin coroutines flowを採用している場合、どこまでflowで流して、どこでLiveDataに変換するか、という問題に直面します。

なら、いっそのことLiveDataを使わず、全てflowでMVVMを完結させられるのではないかと思い、今回試してみました。

その際に気をつけた点、気がついたこと等をまとめます。

続きを読む
LiveDataのHot, Coldって意識できている?

最近のandroid開発において、複雑なlifecycleに対応するのにLiveDataは重要な役割を果たすことが多いです。

その他のstream系ライブラリと比べても非常にシンプルで、初心者でも比較的親しみやすいと思います。

一方で、意外なところで躓くことも多いのが実情かと思います。(経験談)

今回はHot, Coldの話を主軸に、LiveDataの躓きやすいポイントについて触れたいと思います。

続きを読む
新卒1年間でやった仕事をちゃんとまとめる

CyberAgentにエンジニアとして新卒入社して1年が経ちました。

僕は今、 OPENREC.tvのAndroidアプリ開発を担当しています。

この1年、kotlinを導入したり、MVCからMVVMにリアーキテクチャしたり、デザインリニューアルをリリースしたりと、非常に忙しく動き回っていました。

そして非常にありがたいことに、技術者による技術者のための社内表彰「CA BASE AWARD 2020」において、ベストルーキー賞を頂きました。

一方で、僕が何をやっていたのか、多くの人はあまり知らないと思い、また今後自分が見返すためにも、この1年間やってきたことをまとめたいともいます。

続きを読む
リクルートのAndroid リファクタリングコンテストで審査員賞をもらいました

先日(2020/3/20)、リクルートのHOT PEPPER Beautyが主催するAndroidリファクタリングコンテストに参加してきました。

出されたコードを3人1チームで半日ほどリファクタリングしていくコンテストで、ありがたいことに僕たちのチームは審査委員賞を頂きました。

今回は、そこで行ったリファクタ、学んだこと等をまとめたいと思います。

続きを読む
kotlin coroutines flowでいいねボタン問題を解決しよう

複雑化するmobileアプリにおいて、アプリ内の状態をどう整合性を保って保持するかという議論は非常に重要です。

特に、画面を跨いだときにどうデータを同期するかは難しく、少し間違えば結合度が高く、メンテナンス性が低いコードになりがちです。

例えば、twitterのような一覧画面と詳細がある場合に、詳細画面で行った「いいね」を、どうツイート一覧画面に反映させるかという問題です。

いわゆる「いいねボタン問題」と呼ばれているものです。

最近では、OR MapperのRoomにて、内部の状態をLiveDataやFlowで出力することで、解消しているケースを多く見かける気がします

一方、永続化する必要がない、一部のデータのみをやり取りしたい等の理由で、この手法を採用できないケースも多々あると思います。

今回は、roomを使わず、kotlin coroutines flowをふんだん使って、柔軟に対応できる設計を紹介したいと思います。

続きを読む
BaseActivityを解体しよう

お久しぶりです。

この1年ほどjava100%のandroidアプリをkotlin化していくというお仕事をしていました。

javaとkotlinは非常に相性が良く、段階的な移行を大きな問題なく進めることが出来ました。

一方で、一番苦労した点は肥大化したBaseActivityの移行です。

BaseActivityは様々な要因から肥大化しがちです。

今回は、実務で実際に行ったBaseAdtivityの整理方法についてまとめたいと思います。

続きを読む
2018年 振り返り (プロダクト編)

2018年ももう残すこと僅かとなりましたので、1年間を振り返っていきたいと思います。

今回は今年制作したプロダクト編です。

続きを読む
AWSとprerender.ioでSEO対策

最近流行りのreactやvueなどSPAでWebアプリを作ると、サーバサイドレンダリング(SSR)をすべきか悩みます。

Googleのクローラはjavascriptを割ときちんとレンダリングしてくれるため、あまり意識なくてもいいようになりました。

一方、titleやogpなどのmetaタグをjavascriptで書き換えている場合、twitterやslackで共有した際にカードが正しく表示されない問題は依然残されています。

metaタグだけをサーバサイドレンダリングすることも可能ですが、今回はprerender.ioを使い、クローラに向けてだけレンダリング済みのHTMLを返すようにしたいと思います。

続きを読む
FlutterとClean Architectureでアプリ開発

この記事はCyberAgent 19新卒 エンジニア Advent Calendar 2018の24日目の記事です。

AndroidとiOSのアプリを両方開発するのはめんどくさいということで、react nativeやflutterといったマルチプラットフォームのフレームワークが充実してきています。

今回、flutter + MVVM + Clean Architecture + rxdart で簡単なAndroid、iOSアプリを開発したので、その際に気をつけた点等を共有しようと思います。

続きを読む
DNG Webサイトの裏側

この記事はDigital Nature Advent Calendar 2018の23日目の記事です。

Digital Nature Groupは落合陽一准教授が率いる筑波大学の研究室です。

当然ですが、研究成果やイベント情報などを、公式Webサイトで発信しています。

このwebサイトは2017年度まで、外部の企業に依頼して管理してもらっていましたが、契約終了に基づき2018年度から学生で管理することになりました。

今回は、その移行の際に行ったことや注意した点を書いておこうと思います。

続きを読む