2

Android のsetImageResource() ドキュメントには次のように記載されています。

これにより、UI スレッドでビットマップの読み取りとデコードが行われるため、遅延の問題が発生する可能性があります。それが懸念される場合は、代わりに setImageDrawable(android.graphics.drawable.Drawable) または setImageBitmap(android.graphics.Bitmap) と BitmapFactory の使用を検討してください。

サンプルアプリケーションでこの正確な問題を解決しようとしています。ここで「行間を読み」、からの呼び出しを置き換えることになっていると思います:

((ImageView) rootView.findViewById(R.id.screen_image)).setImageResource(imageId);

代わりに電話する

InputStream is = this.getResources().openRawResource(imageId);
Bitmap imageBitmap = BitmapFactory.decodeStream(is);
((ImageView) rootView.findViewById(R.id.screen_image)).setImageBitmap(imageBitmap);

AsyncTaskしかし、 -のようなものを使用して、別のスレッド内からこれを行います

私の理解は正しいですか、それとももっと簡単な解決策がありますか?

アップデート:

developer.android.com にビットマップを効率的に表示するセクション全体があるようです。現在調査中です。

4

3 に答える 3

4

この問題を解決する最も簡単な方法は、スレッドとプロセスのドキュメントで説明されているように、ワーカー スレッドを作成することです。言及されているように、非同期タスクを使用して、これをより複雑なコードに置き換えることができます。最終的な解決策はOnCreateView()、元の遅延コードを置き換えて、メソッド内のコードを変更することでした:

 final View rootView = inflater.inflate(R.layout.fragment_screen, container, false);
 int i = getArguments().getInt(ARG_PANEL_NUMBER);
 String panel = getResources().getStringArray(R.array.panel_array)[i];
 int imageId = getResources().getIdentifier(panel.toLowerCase(Locale.getDefault()),
                "drawable", getActivity().getPackageName());

 ((ImageView) rootView.findViewById(R.id.screen_image)).setImageDrawable(getResources().getDrawable(imageId));

新しいバックグラウンド スレッド:

final View rootView = inflater.inflate(R.layout.fragment_screen, container, false);

// Load image in a separate thread to ensure navigation drawer animation is smooth.
// Replace with Async Task if necessary
    new Thread(new Runnable() {
        public void run() {
            int i = getArguments().getInt(ARG_PANEL_NUMBER);
            final String panel = getResources().getStringArray(R.array.panel_array)[i];

            int imageId = getResources().getIdentifier(panel.toLowerCase(Locale.getDefault()),
                    "drawable", getActivity().getPackageName());

            InputStream is = getActivity().getResources().openRawResource(imageId);
            final Bitmap imageBitmap = BitmapFactory.decodeStream(is);
            rootView.post( new Runnable() {
                public void run() {
                    ((ImageView) rootView.findViewById(R.id.screen_image)).setImageBitmap(imageBitmap);
                    getActivity().setTitle(panel);
                }
            });
        }

    }).start();

上記のドキュメントで説明されているように、非同期タスクを使用すると、このコードが大きくなりすぎた場合に拡張性と保守性が向上します。

于 2013-07-22T18:24:07.447 に答える
2

setImageResource() メソッドは、UI スレッドでデコードを行うため、少し遅くなります。ワーカー スレッドまたは AsyncTaks を使用してこの問題を解決できますが、そのためには簡単で既製のソリューションを利用できます。グライドライブラリです。次のように依存関係をgradleファイルに追加するだけです。

compile 'com.github.bumptech.glide:glide:3.7.0'

そして、そのIDを次のように使用して描画可能な画像を設定します:

Glide.with(context).load(bImage).into(tipImages);

Picasso などの他の画像ライブラリもこのオプションを提供している可能性がありますが、ここでは Glide を使用しました。

于 2016-11-12T17:41:54.353 に答える
0

私はそれをあまり読みません。私がそれを解釈する方法は、単に使用することです:

setImageDrawable(getResources().getDrawable(R.id.yourid);

あなたのコードには、問題を引き起こしている可能性のある別の問題があります。rootView.findViewById を呼び出しています。FindViewById はコストのかかる呼び出しであるため、一度だけ実行する必要があります。このコードがすべてコンストラクターで発生している場合は問題ありませんが、たとえばリスト アダプターの行更新メソッドにある場合は、遅延が発生する可能性があります。findViewById を 1 回実行し、ビューをメンバー変数に割り当てます。

于 2013-07-11T22:51:13.760 に答える