Glideを使用して画像をダウンロードし、将来使用するためにディスクにキャッシュしたいと考えています。この機能をバックグラウンドスレッドから呼び出したいのですが。
私は Glideのキャッシングドキュメント を読みましたが、実際のターゲットがなければ、イメージをダウンロードする方法については説明していません。次に、私は この問題 を見つけて、同様のアプローチを使用しようとしましたが、何を試してもこの例外が発生します。
Java.lang.IllegalArgumentException: You must call this method on the main thread
では、Glideにバックグラウンドスレッドから画像をキャッシュするように指示するにはどうすればよいですか?
編集:バックグラウンドスレッドでGlideのメソッドを呼び出したいです。ハンドラーやその他の方法を使用してそれをUIスレッドにオフロードできることは知っていますが、それは私が求めていることではありません。
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
画像をバックグラウンドスレッドで将来使用するためのキャッシュにロードする場合、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();
質問は正解ですか?
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
}
}
このメソッドを呼び出す必要がありますメインスレッドで
Glide
を使用するメソッドを呼び出すか、バックグラウンドから何かを実行する場合は常に、内部で実行します。
runOnUiThread(new Runnable() {
@Override
public void run() {
// Here, use glide or do your things on UiThread
}
});
メインスレッド内で使用すると、エラーはなくなります。
Glide
のinto(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);
}
});
これを試して。