2025年3月22日土曜日

Jetpack Composeのアニメーションとライフサイクル管理

Jetpack Composeでアニメーションを使用する場合、アプリがバックグラウンドの時でもアニメーションが動いたままでバッテリーを消費してしまうのではないかと心配してしまうかもしれません。
この記事ではアニメーションと画面のライフサイクルの関係について説明します。

アニメーションの動作

Jetpack ComposeのアニメーションはActivityのライフサイクルと連動して動作します。Activityがpause状態になるとその中に含まれるComposableのアニメーションも停止します。これは以下の流れで動作します。

  • Composableがアクティブな間はアニメーションが正常に動作します。この時Composeのアニメーションエンジンはフレームごとにアニメーション値を更新します。
  • Composableが一時停止状態(pause)に移行するとアニメーションも一時停止します。
  • Composableが再開(resume)するとアニメーションも再開します。

この仕組みによりJetpack Composeアプリケーションは効率的にリソースを管理しながらも滑らかなアニメーションを提供できます。

Composableのpause状態の検知方法

アニメーションの挙動をより細かく制御したい場合は、以下の方法でComposableのライフサイクル状態を検知できます。

2025年3月14日金曜日

Jetpack Compose: mutableStateOf の変更の検出の方法を変えるには

はじめに

Jetpack Composeで状態を管理する際に mutableStateOf をよく使うと思います。 その mutableStateOf を作成する際に、policy というパラメータを指定できることをご存知でしょうか?

val state = remember {
    mutableStateOf(initialValue, policy = structuralEqualityPolicy()) // policyを指定
}

この policy パラメータは、Stateオブジェクトの値が変更されたとみなす条件、つまり状態の変更をどのように検出するかを制御することができます。

policy を適切に設定することで不要な再コンポーズを避け、パフォーマンスを向上できる可能性があります。逆に policy を理解せずにデフォルトのまま使用していると、意図しない再コンポーズが発生しパフォーマンスに影響を与えるかもしれません。

この記事では、mutableStateOfpolicy で選択できる3つのポリシーを解説します。

mutableStateOfpolicy で選択できる3つのポリシー

mutableStateOfpolicy パラメータには以下の3つのポリシーを設定できます。

  1. structuralEqualityPolicy(): 構造的等価性ポリシー (デフォルト)
  2. referentialEqualityPolicy(): 参照的等価性ポリシー
  3. neverEqualPolicy(): 常に非等価ポリシー

それぞれ詳しく見ていきましょう。

2025年3月1日土曜日

KotlinのSharedFlowで、コレクターが存在するときだけ値を流す方法

KotlinのshareIn()はコールドFlowをホットFlowにすることができますが、

  • SharedFlowを使用し、コレクターが存在する場合にのみデータを流したい
  • 不要な処理を避け、パフォーマンスを最適化したい

といったケースでは、適切なフローの仕組みを選択する必要があります。

SharedFlowとは?

SharedFlowは、複数のコレクターが同じデータを受け取れるホットFlowの一種です。しかし、デフォルトではコレクターの有無にかかわらずデータが流れ続けるため、「コレクターがいないときは値を流さない」ように制御したほうがいい場合もあります。

SharedFlowの基本