web-dev-qa-db-ja.com

バックグラウンドスレッドのディスク上のグライドキャッシュイメージ

Glideを使用して画像をダウンロードし、将来使用するためにディスクにキャッシュしたいと考えています。この機能をバックグラウンドスレッドから呼び出したいのですが。

私は Glideのキャッシングドキュメント を読みましたが、実際のターゲットがなければ、イメージをダウンロードする方法については説明していません。次に、私は この問題 を見つけて、同様のアプローチを使用しようとしましたが、何を試してもこの例外が発生します。

Java.lang.IllegalArgumentException: You must call this method on the main thread

では、Glideにバックグラウンドスレッドから画像をキャッシュするように指示するにはどうすればよいですか?

編集:バックグラウンドスレッドでGlideのメソッドを呼び出したいです。ハンドラーやその他の方法を使用してそれをUIスレッドにオフロードできることは知っていますが、それは私が求めていることではありません。

7
Vasiliy
GlideApp.with(context)
    .downloadOnly()
    .diskCacheStrategy(DiskCacheStrategy.DATA) // Cache resource before it's decoded
    .load(url)
    .submit(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
    .get() // Called on background thread
6
veritas1

画像をバックグラウンドスレッドで将来使用するためのキャッシュにロードする場合、Glideにこの機能があります

ここでこれを行う方法

 //here i passing application context so our glide tie itself with application lifecycle

FutureTarget<File> future = Glide.with(getApplicationContext()).downloadOnly().load("your_image_url").submit();

ここで、DBに保存する保存済みパスを取得したい場合は、

File file = future.get();
String path = file.getAbsolutePath();

次のようなパス文字列を返す1行でこれを行うこともできます

String path = Glide.with(getApplicationContext()).downloadOnly().load("your_image_url").submit().get().getAbsolutePath();
2
Ashwini Violet

質問は正解ですか?

private class update extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected Void doInBackground(Void... params) {
        try {
        RequestOptions options = new RequestOptions()
        .diskCacheStrategy(DiskCacheStrategy.ALL) // Saves all image resolution
        .centerCrop()
        .priority(Priority.HIGH)
        .placeholder(R.drawable.null_image_profile)
        .error(R.drawable.null_image_profile);

    Glide.with(context).load(imageUrl)
        .apply(options);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        //finish
    }
}
0
Trk

このメソッドを呼び出す必要がありますメインスレッドで

Glideを使用するメソッドを呼び出すか、バックグラウンドから何かを実行する場合は常に、内部で実行します。

runOnUiThread(new Runnable() {
                @Override
                public void run() {

              // Here, use glide or do your things on UiThread

            }
        });

メインスレッド内で使用すると、エラーはなくなります。

0
ʍѳђઽ૯ท

Glideinto(ImageView)メソッドでは、メインスレッドでのみ呼び出す必要がありますが、タイマーにロードを渡すと、backgroundスレッドで実行されます。

あなたができることは、get()の代わりにinto()を呼び出してビットマップを取得し、次にsetImageBitmap()

Glide.with(getApplicationContext())
     .load("your url")
     .asBitmap()
     .get()

または

Glide.with(getApplicationContext())
     .load("your url")
     .asBitmap()
     .into(new BitmapImageViewTarget(imgView) {
      @Override
      protected void setResource(Bitmap resource) {
       //Play with bitmap
        super.setResource(resource);
      }
    });

これを試して。

0