非同期を使用するケース - Ki-Kobayashi/Android-Wiki GitHub Wiki

🟩 なぜ非同期か

Androidの場合、Mainスレッドで重い処理を実行すると、下記のリスクが高まる

  • 画面が止まったように見える(ユーザービリティ低下)
  • ANR(Application Not esponding:APP応答なし)の原因になったりする
      → 長時間メインスレッドがブロックされると、ANRのダイアログが表示されてしまう。
       (アプリが応答を停止すると、待機するか、アプリを終了するかを選択できるダイアログがユーザーに表示)

🟩 どういうときに非同期を活用するか

  • API通信するとき
  • DB操作するとき
  • SharedPreferenceにアクセスするとき
  • 画像や動画の読み込み:
      大容量の画像や動画をメモリに読み込む際には、これをUIスレッドで同期的に行うとアプリがフリーズする可能性があります。そのため、非同期での読み込みが一般的です。
  • バックグラウンド処理:
      ユーザーがアプリを使用していない間に、定期的なデータの更新や同期、通知の作成などを行うバックグラウンドサービスやジョブも非同期処理が必要です。
  • ユーザー入力の待ち時間:
      ユーザーがボタンをクリックしたり、画面をタップした場合に、その処理が時間がかかる場合も非同期処理を利用してUIがフリーズしないようにします。
  • ファイルの読み書き:
      ローカルファイルの読み込みや書き込みも、大容量のデータを扱う場合やI/O操作が時間がかかる場合に非同期に行われることがあります。
  • センサーデータの取得:
      センサーデータの取得や位置情報の更新など、外部からのイベントに対する非同期処理も一般的です。
  • アニメーション:
      UI上でのアニメーションも非同期で制御されます。アニメーションが進行中でもメインスレッドがブロックされないようにするため、非同期処理が利用されます。

🟩 非同期の方法

  1. 🟡Couroutine:
      →1回だけ非同期処理を実行したい時に使用
      → ex) Room: insert, update, delete>一度だけ実行すればいい => Coroutine
      → ex2) Roomの場合:🌞関数の頭に「suspend」をつければそれでOK
  2. 🟡Flow
      → 値を監視し、変更があるたびに取得等の処理を実行したいときに使用
      → ex) Room: getAll > 変更があるたびに最新の値を取得したい => Flow
      → ex2) Roomの場合:🌞関数の戻り値を「Flow<戻り値の型>」で囲えばOK
⚠️ **GitHub.com Fallback** ⚠️