質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

1446閲覧

【Android Studio】2つのImageViewだけでOutOfMemoryErrorとなってしまう

kkk151

総合スコア10

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

1クリップ

投稿2020/10/21 06:34

アクティビティに2つのImageViewを置いただけの画面を実機で確認しようとするとOutOfMemoryErrorとなってしまいます。
画像サイズが大きすぎるのかと思いましたが、どちらも数十キロバイト程度の画像です。

エミュレータだと問題なく表示されるのですが、これは何の原因によるものでしょうか?
使用している機種はSHARP SHV39で、空きメモリは1.5GB程です。

コードとエラー文は以下の通りです。

xml

1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 tools:context=".TopActivity"> 8 9 <ImageView 10 android:id="@+id/imageView" 11 android:layout_width="30dp" 12 android:layout_height="30dp" 13 app:layout_constraintStart_toStartOf="parent" 14 app:layout_constraintTop_toTopOf="parent" 15 app:srcCompat="@drawable/logo_nobg" /> 16 17 <ImageView 18 android:id="@+id/imageView2" 19 android:layout_width="60dp" 20 android:layout_height="30dp" 21 app:layout_constraintStart_toEndOf="@+id/imageView" 22 app:layout_constraintTop_toTopOf="parent" 23 app:srcCompat="@drawable/logo_string_gray" /> 24</androidx.constraintlayout.widget.ConstraintLayout>

errorMessage

1java.lang.OutOfMemoryError: Failed to allocate a 128000012 byte allocation with 2960152 free bytes and 2MB until OOM

一応画像が1枚であれば別のエラー文となり、下記記事を参考に表示できました。
https://qiita.com/itouda/items/a5880f5c3ca6d533588c

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

あまり明確な回答はできませんが。

画像サイズが大きすぎるのかと思いましたが、どちらも数十キロバイト程度の画像です。

これって、PC上のファイルサイズではないですか?
ハッキリ言って、あまり参考になりません。

androidに限らず、pngファイルやjpegファイルというのはそのままでは使えず、基本的に「どこかで」無圧縮ビットマップ画像に置き換えてから処理されます。
(まぁ、その辺りは一般的なプログラミングをしていると気にしない事ですが、OpenGLのような低レイヤーなグラフィックプログラムをしていればわかる事です)
ですので、重要なのはファイルサイズよりも解像度(幅と高さ)になります。

java.lang.OutOfMemoryError: Failed to allocate a 128000012 byte allocation with 2960152 free bytes and 2MB until OOM

あくまで推測ですが、このエラーメッセージが無圧縮ビットマップ画像を作ろうとして起きているとするならば、もしアルファ付きの正方形画像だとしたら、sqrt(128000012 / 4)でおおよそ5656x5656の画像だと推測されます。
だとしたら、ちょっと大きいですね。(でも、それだけ大きい画像のファイルサイズが数十kBになるのか、ちょっと疑わしいですが)

対策としては、「largeheap」を指定するとか、画像を小さくするとか、画質を落とすとかあると思いますが、どれぐらい効果があるかはわかりません。(largeheapって、結構昔の話だと思うのだけど、今どきでも効果があるのかしら)


これを書くためにいろいろと調べていたのですが、Bitmap.ConfigHARDWAREなんてものがあるんですね。
これを使えば一発で解決できそうですけど、「Added In API Level 26」(Android8以上)なので、現状ではそれ以下のバージョンを切り捨てるのはきつそうですね…。


自分も趣味で画像ビューアを作成した事がありましたが、その時にはOOMには悩まされました。
結構Javaで扱えるメモリは結構少なく、結局でJavaで処理するのに限界を感じて、NDKを使ってC++とOpenGLで画像を処理する事により、OOMの発生をかなり抑える事ができました。
まぁ、そのためにいきなり「OpenGLでやれ」というのは酷な話だと思いますが。

投稿2020/10/23 18:57

katsuko

総合スコア3491

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kkk151

2020/10/24 13:19

解像度を下げてみたところ問題なく表示できました! 元の画像の解像度は2000×2000となっていました。 詳しい解説や他の解決法も教えていただきとても勉強になりました。 画像読み込み時の速度や負荷に影響するのはファイルサイズのみかと思っていました。 初歩的な問題だったかと思いますが、色々と調べていただき本当にありがとうございましたm(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問