【Android】”Out of memory”エラー 対処

#Android
writtdden by 上様

こんにちは。
Androidエンジニア見習い 上様です。
最近チラホラ入学式に向かう子供を連れた親御さんを見かけて、心があったかくなっています。
年々あがる気温で春とは思えない暑さになりそうですね。

最近、業務中に遭遇した非同期処理の内容が原因でAndroid Studioのメモリ圧迫につながったので
今回は纏めていこうと思います。

発生したエラー

java.lang.OutOfMemoryError: pthread_create (○○○KB stack) failed: Try again

要は割り当てメモリに対して、使用メモリ、メモリキャッシュが多いです。っていうことを言われています。
○○○KBの表記は、実行環境などによって変化する値です。

クラッシュ発生時の状況

位置情報を元にしたお天気表示アプリを作成していました。テスト後、数分放置でクラッシュしました。

使用環境

PC: Mac Book Pro
AndroidStudioバージョン:2022.1.1 Patch 2
エミュレータ設定:Android 13.0 API33

原因

「位置情報の取得→WebAPI→天気表示」の処理フローを実装していましたが、
取得間隔を設定していなかった為、極端に短い間隔で実行されてしまいメモリ負荷に繋がりました。
(そしてクラッシュ・・・。)

対処方法

以下いずれかの方法で位置情報取得タイミングのトリガーを実装する必要があります。
  1. 自動実行されるタイミングを設定(1分おき/アプリ初回起動時など)
  2. 実行するトリガーとなるボタン等のレイアウトパーツを作成し、ユーザの動作が行われた時に取得するように設定

今回は、位置情報取得に「ボタンを押下する」というトリガーを設けて処理を進めることで対処できました。

 

補足情報

位置情報のパーミッション取得方法について

@SuppressLint(“MissingPermission”)とは

‘@SuppressLint(“MissingPermission”)’とは、Androidアプリの開発で、「パーミッションが必要」とする場合に、使われるものです。

しかし、パーミッションが必要かどうか確認せずに使うと、アプリのセキュリティに問題が生じる可能性があるので、注意が必要です。

なぜ’@SuppressLint(“MissingPermission”)’を利用したか

今回実装した位置情報の取得にはパーミッションが必要であることを宣言する必要がありますので、こちらを活用しました。

位置情報などのパーミッションの取得方法には、他にカスタムダイアログを追加するなど
様々な方法がありますので、また次回以降に解説できたらと思っています。

最後に

開発見習いには、バックグラウンドで動いている処理に目を向けることを怠ってしまいますが頑張っていきます…。
非同期処理など難しいですよね….頑張っていきましょう!
それでは、皆様も体調に気を付けてお過ごしください!!

Favorite