getDrawable()でときどき空の画像が返ってきます

585 views
Skip to first unread message

Sugawara

unread,
Jun 8, 2012, 1:50:15 AM6/8/12
to android-g...@googlegroups.com
こんにちは。

画像をランダムで背景表示させてるのですが、
ときどきResources#getDrawable()で「高さ-1,幅-1」の画像が返ってきます。
画像は5枚で、そのうちの特定の1枚だけが、たまに、取得できない状態です。
エラーは出ないのですが、背景がなくなり、レイアウトが崩れて表示されます。

--------------------------------

LayoutInflater inf = this.getLayoutInflater(); // レイアウトインフレーターから取得
View view = inf.inflate(R.layout.sample, null);
FrameLayout layout = (FrameLayout) view.findViewById(R.id.sampleLayout);; // 変更する背景レイアウト

// String random; // ランダムな文字列(a,b,c,d,eのいずれか)が入ってます

int resid = getResources().getIdentifier("sample_" + random, "drawable", getPackageName()); // リソースID取得
layout.setBackgroundResource(resid); // 背景を設定

Drawable d =  getResources().getDrawable(resid);
Log.d("sample", "drawable width:" + d.getIntrinsicWidth() +
" height:" + d.getIntrinsicHeight()); // ★なぜか{-1,-1}の画像が返ってくることが

// ...このあと既存レイアウトにlayoutをaddView()

--------------------------------

・リソース名が間違ってる?
>ログは正常。そもそもNotFoundExceptionが出るはず。
・画像が大きすぎる?正常じゃない?
>8KBほどの80px*80px(24bit)の普通のPNG画像です。

ループで-1,-1が返らないまで回したりもしたんですが、無限ループにはまりました。。
(遅延させればいいんでしょうか……しかしなぜ正常に返ってこないかがわかりません)
起こらない方が多く、10回中1回くらい(もっと少ないくらい)の割合で、アプリを再起動すれば直ったり、直らなかったり……といった感じです。

何か原因、対策、疑うべきポイント、ささいな点でもいいのでアドバイスいただけたら嬉しいです。
以上、よろしくお願いいたします。

--------------------------------

アプリケーションはルーレットのようなもので、大量のTextViewをパネルにし、
スタートボタンでHandlerを回し、パネルをランダムに選び、ストップボタンでHandlerを止め、
その結果により上記プログラムで画像を変えています。

kacodama

unread,
Jun 8, 2012, 2:10:57 AM6/8/12
to android-g...@googlegroups.com
ネイティブのメモリが足りなくなってるのではないでしょうか?
解像度に応じたサイズを用意していますか?
特定の解像度しか用意していないと、

特定の解像度の画像を読み込み→ 解像度 に応じてサイズ変換

が勝手に実行されますので、その分メモリ消費が激しくなります。

表示しなくなったbitmapはrecycleしてますか?
あとはソフトウェアリファレンスとかでググると幸せになれるかもしれません。


2012年6月8日金曜日 14時50分15秒 UTC+9 Sugawara:

2012年6月8日金曜日 14時50分15秒 UTC+9 Sugawara:

Sugawara

unread,
Jun 8, 2012, 3:57:57 AM6/8/12
to android-g...@googlegroups.com
早速の返信ありがとうございます。

> 解像度に応じたサイズを用意していますか? 
まだテスト段階だったのでxdpiの画像しか用意しておりませんでした。
それで、問題の画像のみhdpi,mdpiと各dpiごとに用意したところ、見事に問題解消しました。
ほんの数バイトだけ他の画像より大きい、色違いの画像だったのですが……なるほど。

メモリ不足で変換が間に合ってない(手が回せない)、といった理解でよろしいでしょうか。

あまり派手なことやって(るつもり)なく、OutOfMemoryErrorも出てないのでメモリ消費量意識してませんでした。
取り急ぎDDMSで調べ、Drawable周りを調整してみます。ありがとうございました。

2012年6月8日金曜日 15時10分57秒 UTC+9 kacodama:

kacodama

unread,
Jun 8, 2012, 4:12:28 AM6/8/12
to android-g...@googlegroups.com
ネイティブヒープが足りてないのだとすると,DDMSでも見られなかったような気がしますが・・・
ネイティブのOOMは例外では落ちないですが、Logcatに流れているかと思うので、確認してみてください。

2012年6月8日金曜日 16時57分57秒 UTC+9 Sugawara:
2012年6月8日金曜日 16時57分57秒 UTC+9 Sugawara:

Sugawara

unread,
Jun 8, 2012, 4:40:09 AM6/8/12
to android-g...@googlegroups.com
何度もすいません。
BitmapほかリソースもDalvikヒープで管理される……ってレベルの知識でした、申し訳ありません。
それも含めてもう一度勉強してみます。。

2012年6月8日金曜日 17時12分28秒 UTC+9 kacodama:
Reply all
Reply to author
Forward
0 new messages