我想使用Glide急切下载图像并将其缓存在磁盘上以备将来使用。我想从后台线程调用此功能。
我已经读过Glide's caching documentation,但是它没有解释如何在没有实际目标的情况下下载图像。然后,我发现this issue并尝试使用类似的方法,但是无论我如何尝试,都会遇到此异常:
java.lang.IllegalArgumentException: You must call this method on the main thread
那么,如何告诉Glide从后台线程缓存图像?
编辑:我真的很想在后台线程上调用Glide的方法。我知道我可以使用Handler和其他方式将其卸载到UI线程,但这不是我要的。
答案 0 :(得分:3)
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
答案 1 :(得分:2)
如果要在缓存中加载图像以供将来在后台线程中使用,则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();
现在,如果您要检索要存储在数据库中的已保存路径,则可以进行
File file = future.get();
String path = file.getAbsolutePath();
您也可以只在一行中执行此操作,返回这样的路径字符串
String path = Glide.with(getApplicationContext()).downloadOnly().load("your_image_url").submit().get().getAbsolutePath();
答案 2 :(得分:0)
我问对了吗?
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
}
}
答案 3 :(得分:0)
您必须在主线程上调用此方法
无论您调用哪种方法使用Glide
或在后台执行某项操作,请在内部运行:
runOnUiThread(new Runnable() {
@Override
public void run() {
// Here, use glide or do your things on UiThread
}
});
要在主线程中使用它,然后应消除错误。
答案 4 :(得分:0)
into(ImageView)
的{{1}}方法只要求您在主线程上调用它,但是当您将加载传递给Timer时,它将在Glide
线程中执行。
您可以做的是通过调用background
而不是get()
来检索位图,然后通过调用into()
在bitmap
上设置ImageView
。
setImageBitmap()
或
Glide.with(getApplicationContext())
.load("your url")
.asBitmap()
.get()
尝试一下。