web-dev-qa-db-ja.com

Androidグライド:ビットマップをダウンロードしてキャッシュする方法は?

Glideを使用してAndroidに画像をダウンロードしてキャッシュしています。ビットマップをImageViewに直接ロードしたくないという事実を除いて、すべてがうまく機能します。フェードアニメーションも、画像プレースホルダーも必要ありません。

私が欲しいのは、アプリケーション全体に画像をダウンロードするのに役立つグローバルメソッドを作成することです。

public class MyApp extends Application {

   public static void downloadImage(String url, final OnImageLoadedCallback callback) {

     // And how to implement the listener ?

     RequestListener<String, Bitmap> requestListener = new RequestListener<String, Bitmap() {
        @Override
        public boolean onException(Exception exc, String string, Target<Bitmap> target, boolean isFirstResource) {

           callback.onDone(null);               

           return false;
        }

        @Override
        public boolean onResourceReady(Bitmap bitmap, String string, Target<Bitmap> target, boolean isFromMemoryCache, boolean isFirstResource) {

            callback.onDone(bitmap);

            return false;
        }
     };

      Glide.with(context)
           .load(url)
           .asBitmap()
           .dontAnimate()
           .diskCacheStrategy(DiskCacheStrategy.SOURCE)
           .listener(requestListener);
   }

}

問題は、リスナーの実装方法がわからないことです。 RequestListenerはまったく呼び出されません。

10

into を呼び出すまで、Glideの読み込みは開始されません。 RequestListenerインターフェースは要求を監視しますが、通常は結果を処理するためのものではありません。 RequestListenerを使用する代わりに、コールバックに Target インターフェイスを実装させ、 into を使用して渡すことを検討してください。

または、 SimpleTarget を拡張して、RequestListenerを使用しようとしているのと同じ方法で各リクエストに渡すこともできます。

Target target = Glide.with(context)
     ...
     .into(new SimpleTarget<Bitmap>(width, height) {
          @Override
          public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) {
              callback.onDone(resource);
          }

          @Override
          public void onLoadFailed(Exception e, Drawable errorDrawable) {
              callback.onDone(null);
          }
     });

// At some point later, if you want to cancel the load:
Glide.clear(target);

Glideが画像を適切にダウンサンプリングして変換できるように、幅と高さを指定する必要があります。これらのビットマップをビューに表示している場合、キャンセルの問題が発生する可能性もあります。その場合、ロードAPIでビューを利用できるようにして、ビューを into に渡すことを強くお勧めします。サイズ設定とキャンセルを自動的に処理します。

15
Sam Judd

私はGlide3.7.0を使用し、次の方法で画像をダウンロードします。
注意することが重要です-非同期で実行されます

Glide.with(this)
    .load(url)
    .downloadOnly(new SimpleTarget<File>() {
        @Override
        public void onResourceReady(File resource, GlideAnimation<? super File> glideAnimation) {
            LOGGER.debug("Photo downloaded");
        }
    });

キャッシュされた画像を表示する必要がある場合は、同じURLとDiskCacheStrategy.SOURCEを使用します。

Glide.with(this)
    .load(url)
    .diskCacheStrategy(DiskCacheStrategy.SOURCE)
    .into(imageView);
6
Nik Kober

Glide4.9.0ではさらにシンプルになりました。

Glide.with(this)
    .downloadOnly()
    .load(url)
0