1. ホーム
  2. android

[解決済み] アプリケーションコンテキストによるグライドイメージのロード

2023-06-20 07:31:20

質問

アンドロイドアプリで画像の読み込みにglideを使っていますが、クラッシュを避けるため、アプリケーションのコンテキストで画像を読み込んでいます。アプリケーションのパフォーマンスとメモリにどのような影響を与えますか?

どのように解決するのですか?

<ブロッククオート

アプリケーションのパフォーマンスやメモリにどのような影響があるのでしょうか?

Glideは非常に多くの .with() メソッドを提供するのは、ライフサイクルに沿っているからです。

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

  • もしあなたが with(getActivity().getApplicationContext()) を使用しても何も起こりません。3MBのデータはすべてダウンロードされ、次にデコードされ、キャッシュされ、おそらくImageViewに設定され、そしてそれはガベージコレクションされます。
  • もしあなたが with((Fragment)this) Glide は Fragment のライフサイクルイベントを購読し、Fragment が停止されるとすぐに、未処理のリクエストはすべて一時停止され、破棄されると保留中のリクエストはすべてクリアされます。これは、画像のダウンロードが途中で停止し、その死んだフラグメントによってそれ以上のリソースが使用されないことを意味します。
  • もしあなたが with(getActivity()) GlideはActivityのライフサイクルイベントを購読し、上記と同じことが起こりますが、Activityが停止または破壊されたときのみです。

ですから、ベストプラクティスは、未使用のリクエスト完了を避けるために、可能な限り近いコンテキスト/フラグメントを使用することです! (ロードを停止する手動方法もあります。 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);
    }
}

で、これらをActivity/Fragmentから利用します。

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