web-dev-qa-db-ja.com

アプリケーションコンテキストを使用した画像の読み込み

Androidアプリでの画像の読み込みにグライドを使用しています。これは、アプリケーションコンテキストで画像を読み込む際のクラッシュを回避するためです。これがアプリケーションとメモリのパフォーマンスにどのような影響を与えますか?

53
HariRam

これがアプリケーションとメモリのパフォーマンスにどのような影響を与えますか?

Glideは、ライフサイクルに従うという理由で、非常に多くの.with()メソッドを提供します。

アクティビティに動的に追加されるFragmentを想像してください。 onCreateViewメソッドでは、3MBの画像のグライドロードを開始します。では、ユーザーが戻るボタンを押してフラグメントが削除された場合、またはアクティビティ全体が閉じられた場合はどうなりますか?

  • with(getActivity().getApplicationContext())を使用しても何も起こらない場合、3MBのデータがすべてダウンロードされ、デコード、キャッシュされます。おそらくImageViewに設定されます。これは、Glide内部からの参照のみであるため、ガベージコレクションされます。
  • with((Fragment)this) Glideを使用する場合、フラグメントのライフサイクルイベントにサブスクライブし、フラグメントが停止するとすぐに、未処理のリクエストを一時停止する必要があります。破棄されると、保留中のすべてのリクエストがクリアされます。これは、イメージのダウンロードが途中で停止し、そのデッドフラグメントがこれ以上リソースを使用しないことを意味します。
  • with(getActivity())を使用すると、Glideはアクティビティのライフサイクルイベントにサブスクライブし、上記と同じことが起こりますが、アクティビティが停止または破棄された場合のみです。

したがって、ベストプラクティスは、最も近い可能なコンテキスト/フラグメントを使用して、未使用の要求の完了を回避することです。 (ロードを停止する手動の方法もあります:Glide.clear(ImageView|Target)。)


これを実際に適用するには、可能な場合はwith(this)を使用してください。ただし、アダプターや集中イメージの読み込み方法などでは使用できない場合は、RequestManager glideを引数として渡し、glide.load(...、 例えば:

static loadImage(RequestManager glide, String url, ImageView view) {
    glide.load(url).into(view);
}

またはアダプター内:

class MyAdapter extends WhichEveryOneYouUse {
    private final RequestManager glide;
    MyAdapter(RequestManager glide, ...) {
        this.glide = glide;
        ...
    }
    void getView/onBindViewHolder(... int position) {
        // ... holder magic, and get current item for position
        glide.load... or even loadImage(glide, item.url, holder.image);
    }
}

アクティビティ/フラグメントからこれらを使用します。

loadImage(Glide.with(this), url, findViewById(R.id.image));
// or
list.setAdapter(new MyAdapter(Glide.with(this), data));
203
TWiStErRob