この例は、setImageResourceとsetImageDrawableの場合で、同じことが背景にも当てはまりますか?
それでは、好ましい選択は何ですか?
ドキュメント によるとsetImageResource
、UIスレッドでビットマップの読み取りとデコードが行われるため、遅延が発生する可能性があります。setImageResource
したがって、上記のどの場合がより良い選択であるかを尋ねるなら、あなたの質問はより良いでしょうsetImageDrawable
。
私の推測では、setImageResource
は画像の遅延読み込みに使用さsetImageDrawable
れ、ビューの開始時にDrawableを介して画像を既に読み込みている場合に使用されます。どちらがあなたに最も適しているかは、おそらくあなたがより深刻なメモリの制約があるかどうかに依存します。私の経験でsetImageResource
は、ほとんど必要ありません。
そして、あなたのコードが機能しない理由に答えるために; getDrawable()
これは、resourceId 0から実行できないためです。これは、リソースが見つからないため、例外をスローします。setImageResource
は遅延読み込みであるため、Drawableを作成する前にリソースが0であるかどうかを確認し、例外をスローしません。あなたはおそらくそれをリファクタリングすることができますif(checked) setImageDrawable(..) else setImageDrawable(null);
実際には、両方の方法に少し違いがあります。
最初のものは、 resフォルダーsetImageResource
に必要な画像がある場合に使用されます。ただし、Drawableタイプのオブジェクトを作成する場合は、2番目の方法が使用される可能性があります。setImageDrawable
また、リソースファイルはDrawableタイプに変換できますが、DrawableをResourceに変換することはできないことに注意してください。
resフォルダーに画像がある場合は、画像をDrawableに変換してから、2番目の方法を使用するのではなく、最初の方法を使用するとよいでしょう。
ドローアブルはメモリ内にありますsetImageResourceは、genファイルに保存されているIDへのポイントです