0

私は SQL データベースを持っています。DB から、リストにアイコンを表示する必要があることを使用して名前文字列を取得します。これを行うには、2 つの方法に従いました。1 つは次のとおりです。

int id= context.getResources().getIdentifier(path + i.getIcon(),null, null);

この方法はあまり効率的ではないことがわかったので、他の手法に従いました。

try {
            Class res = R.drawable.class;
            Field field = res.getField(i.getIcon());
            drawableId = field.getInt(null);
            holder.ContactImage.setImageResource(drawableId);
        }
        catch (Exception e) {
            Log.e("MyTag", "Failure to get drawable id.", e);
            holder.ContactImage.setImageResource(R.drawable.ic_all_contacts_green);
        }

ここでの問題は、DB から取得したアイコン名が Drawable フォルダーに存在しない場合があることです。そのとき、スクロールしようとすると UI が遅く感じ、上記の両方の手法を使用してみましたが、役に立ちませんでした。 .

アイコンが見つからない場合、この問題を解決するには、最初のメソッドが NULL をスローし、2 番目のメソッドが例外を表示しますが、それを行うのに時間がかかりすぎるのはなぜですか? UI の反応が鈍くなるのを防ぐ方法、効率的なテクニックはありますか?

4

1 に答える 1

0

これを行うには、2 つの方法に従いました。

私がお勧めします:

context.getResources().getIdentifier(i.getIcon(), "drawable", context.getPackageName())

アイコンがない場合、最初のメソッドは NULL をスローし、2 番目のメソッドは例外を表示します

存在しないアイコンを要求しないでください。コンパイル時にアイコンが存在し、存在しないことを正確に知っているので、存在しないアイコンを要求しないことは完全に可能です。

UI の反応が鈍くなるのを防ぐ方法

Traceviewを使用して、パフォーマンスの問題がどこにあるかを正確に見つけます。一部はリフレクションになります-明示的に行うか、(より良い) を使用するかに関係なくgetIdentifier()、まだリフレクションが進行中です。理想的には、呼び出しの結果をキャッシュしgetIdentifier()ます。しかしそれ以上に、Traceview は問題を特定するのに役立ちます。

于 2012-08-05T14:44:17.347 に答える