DroidKaigi 2023に参加しました!
はじめに
「ニフティ不動産」アプリのAndroid側の開発を担当している、TS-Elfenです。Androidの技術共有と、コミュニケーションを目的としたカンファレンス「DroidKaigi」に現地参加してきました!弊社のプロダクト開発でも活かせる内容もあり、とても楽しく参加できたイベントだったため、本記事では、その感想などをご紹介しようと思います。
DroidKaigi 2023の概要
今回のDroidKaigi 2023は以下のような日程で開催されました。
- 1日目(9/14(木) 10:30-19:20)
- 様々なスピーカーによるトーク
- 特定のテーマについて話せるMeetUp
- AfterParty
- 2日目 (9/15日(金) 10:30-18:00)
- 様々なスピーカーによるトーク
- 特定のテーマについて話せるMeetUp
- 3日目(9/16(土) 11:00-16:00)
- オフィスツアー
- キャリア相談会
- パネルトーク
- 特定のテーマについて話せるMeetUp
上記にある「特定のテーマについて話せるMeetUp」という項目は、その名のとおり、様々なテーマ(例えば「初学者」など)を掲げたテーブルが用意されており、参加者同士が気軽に意見交換することができるというコーナーです。ランチタイムやおやつタイムに時間設定されていて話しやすい環境がつくられており、とてもありがたいと感じました!
また、スポンサーブースでは様々な企業がブースを出しており、それぞれ、会社の事業紹介やノベルティの配布などを行っていました。
そして、会場ではスナックやペストリーなどの軽食や、バリスタによる美味しいコーヒーの提供サービスなどがあり、リラックスした状態で講演を聞くことが出来ました!
聴講した講演の感想
それでは、本カンファレンスのメインコンテンツであるトークの一部について紹介します。
これで安心! Compose 時代のDon’t keep activities対応
これで安心! Compose 時代のDon’t keep activities対応 | DroidKaigi 2023
内容
- 開発者オプションにある「アクティビティを保持しない」オプションについてのトーク
- 今見えている画面以外のアクティビティを全てクリアするようにするオプション
- AndroidのOSによって、メモリが不足した際に表示していないアクティビティが意図せずクリアされてしまう場合がある
- 特に、古い端末はメモリがあまり多くない場合が多く、古い端末でのみ起こる不具合などの再現に役にたつ!
- いつメモリは不足することが多いか?
- 画面遷移で新しくactivityが生成されるとき
- アプリからカメラなどの外部アプリを起動する時
- 対応すべきか?
- アプリや画面の特性に応じる
- 例)長文入力、多様な選択肢を選ぶような動作を前のActivityでやっており、次の確認画面に遷移したが、前の画面に戻って入力を修正したい
- ここでActivityが破棄されてしまうと、入力が最初からやり直しになってしまいUXが損なわれる
- 例)長文入力、多様な選択肢を選ぶような動作を前のActivityでやっており、次の確認画面に遷移したが、前の画面に戻って入力を修正したい
- 問題の発生頻度や、上記の特性に応じて優先順位を検討する
- アプリや画面の特性に応じる
- 対応方針
- UIStateを保存する枠組みを使う
- Composeでは、クラシックなViewよりも多くの情報を保存する必要があるため注意
- 保存のために用いるAPI
- SavedStateAPI
- Bundleにデータを保存するためのAPI
- ComposeやView、ViewModelなどで参照可能
- Bundleには50KBくらいしかデータが入らない想定でいた方が良い
- SavedStateAPI
- Bundleの容量
- なぜこんなに少ないのかというと、意識せずに保存されている情報があるから
- Navigation-Composeの遷移への引数はBundleに保存されている
- 画像を渡す際には、APIを叩くために必要な情報のみにする。画像とかデータそのものを送るのはやめたほうがいい
- Observeなどの状態も問答無用で破棄されるため、新しいActivityを開くときは気をつけた方が良い
感想
- ニフティ不動産の賃貸アプリでもGoogleMapを起動する導線があるので、状態の管理には気をつけなければいけないなと思いました。
- 開発で使えるオプションに関する説明は、今後問題に直面した際に活用できるのでありがたいと思いました。
Jetpack Compose の Side-effect を使いこなす
Jetpack Compose の Side-effect を使いこなす | DroidKaigi 2023
内容(メモ)
- 副作用とは?
- 関数の結果を返す以外の効果のこと
- 実行順によって結果が変わったりするのでテストがしにくいもの
- Jetpack Composeにおける副作用とは?
- コンポーズの関数以外での変化
- スナックバーを出す、メッセージを表示する、画面遷移をするなど
- これらの動作を安全に実行するようにする必要がある
- コンポーズの関数以外での変化
内容(コードと動作の一部の紹介)
LaunchedEffect
LaunchedEffect(key) {
// ここに処理を書く。中はCoroutinesになっている
}
LaunchedEffect
内のブロックが呼ばれるタイミングは以下の2つ。- Composableが初回にCompositionに入った時
key
の値に変化があったとき
- したがって、外部要因でこのブロックがあるComposableにRecompositionが走っても、Keyが変わっていない場合は中身が呼ばれることはない。
- また、内部が
Coroutines
になっており、suspend関数を呼び出すことが可能になっている。- suspend関数の処理のキャンセルについては、次の2パターンで実施される
- Keyが変わった時
- UIのTreeからComposeが消える時
- suspend関数の処理のキャンセルについては、次の2パターンで実施される
DisposableEffect
DisposableEffect(key) {
// LaunchedEffectと同じ条件で呼び出されるブロック
// ※このブロックはCoroutinesではないので注意
onDispose {
// 破棄されるときなどに呼び出されるブロック
}
}
- ライフサイクルの監視に用いられる。
- 破棄する際に何かしらの処理をしたいときにこれを用いる。
- keyが変わると、前回のブロックにおける
onDispose
が呼び出されてから、次のDisposableEffect
内のブロックが呼び出される。 LaunchedEffect
を用いたいがCoroutines
が不要な場合に、空のonDispose
を定義してこれを使うこともある
derivedStateOf
val listState: LazyListState = rememberLazyListState()
val showBackButton by remember {
derivedStateOf {
listState.firstVisibleItemIndex > 0
}
}
LazyList(...) {
...
// ①良くない例
if(listState.firstVisibleItemIndex > 0) {
Button()
}
// ②良い例
if(showBackButton) {
Button(...)
}
}
- Composableは、中で使われている変数が書き換わると適宜、再描画を行なってくれる
- Listがスクロールしていったら、戻るボタンを表示したい!といったユースケースを考えた際に、コードの①のような実装がまず思いつく
- ListStateは、Listを少しスクロールするだけで中身が変わる⇨Listを少しスクロールするだけでLazyListの再描画が走ってしまう
- コードの②のように、
derivedStateOf
を使う事でそれは解決する derivedStateOf
で囲んだブロックは、ブロック内の計算結果が変化した場合のみ、再描画の対象となる。
感想
- Androidの実装や環境周りで困ったとき、検索でこのスピーカーの方の記事がよくヒットしてとても参考になりました。
- そういう方の講演が生で聞けるのは感動でした
- Composeの内部のこの辺りの処理については、まだ把握していない部分も多く、早速次の開発で活かせる部分がないか検討しているところです。非常に勉強になりました・・・。
全体を通しての感想
コードや実行例を示してのJetpack Composeの実装方法の説明といった、勉強になるトークセッションを多く聞くことが出来た為、今後の業務の参考にしたいと考えております。また、計測や不具合調査の手法についても知見を深めることができたので、今後選択肢のひとつとして活用していきたいと思いました。また、iOSを主担当としている弊社のメンバーも複数人参加していましたが、SwiftUIの知識を生かしてJetpack ComposeのUIの組み方などのトークを理解しながら聞いていたようでした!
弊社ではiOSDCやDroidKaigi、AWS Summitといった最新の技術を取り扱うカンファレンスや、技術力向上を目的としたイベントに参加することを積極的に応援しています。
- 『iOSDC Japan 2023』でルーキーズLT&スポンサーセッションに登壇しました!
- AWS Summit Tokyo 2023に現地参加してきました!
- ISUCON12予選に出場しました!(チーム:わいわいわい)
気になった方はぜひ採用情報の方を見て頂けると幸いです。よろしくお願いします!
掲載内容は、記事執筆時点の情報をもとにしています。