我正在使用此代码从网络加载图像。
我同时发出多个请求,因此出现错误 FileNotFound
但文件实际上存在于服务器上。
因此我想问一下,如果 Glide 失败,我该如何重试 Glide 请求?
public static void LoadNetworkImage(final Context context, final ImageView imageView, final String imageUrl) {
Glide.with(context).
load(imageUrl).
listener(new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
//if loading fails then again make request
LoadNetworkImage(context,imageView,imageUrl);
return true;
}
@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
return false;
}
}).
into(imageView);
}
我研究过这个讨论How to retry image loading ,if Glide fails?但这没有帮助。
错误日志
class com.bumptech.glide.load.engine.GlideException: Failed to load resource There was 1 cause: java.io.FileNotFoundException(No content provider: http://10.0.2.2:5000/image/tmpfhpbjdsf.png) call GlideException#logRootCauses(String) for more detail Cause (1 of 1): class com.bumptech.glide.load.engine.GlideException: Fetching data failed, class android.content.res.AssetFileDescriptor, LOCAL, DataCacheKey{sourceKey=http://10.0.2.2:5000/image/tmpfhpbjdsf.png, signature=EmptySignature} There was 1 cause: java.io.FileNotFoundException(No content provider: http://10.0.2.2:5000/image/tmpfhpbjdsf.png) call GlideException#logRootCauses(String) for more detail Cause (1 of 1): class java.io.FileNotFoundException: No content provider: http://10.0.2.2:5000/image/tmpfhpbjdsf.png 07-30 20:51:35.127 18903-18903/com.example.muhammadusman.project I/Glide: Root cause (1 of 1) java.io.FileNotFoundException: No content provider: http://10.0.2.2:5000/image/tmpfhpbjdsf.png at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1396) at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1247) at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1170) at com.bumptech.glide.load.data.AssetFileDescriptorLocalUriFetcher.loadResource(AssetFileDescriptorLocalUriFetcher.java:22) at com.bumptech.glide.load.data.AssetFileDescriptorLocalUriFetcher.loadResource(AssetFileDescriptorLocalUriFetcher.java:13) at com.bumptech.glide.load.data.LocalUriFetcher.loadData(LocalUriFetcher.java:44) at com.bumptech.glide.load.engine.SourceGenerator.startNext(SourceGenerator.java:62) at com.bumptech.glide.load.engine.DecodeJob.runGenerators(DecodeJob.java:299) at com.bumptech.glide.load.engine.DecodeJob.runWrapped(DecodeJob.java:269) at com.bumptech.glide.load.engine.DecodeJob.run(DecodeJob.java:230) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) at java.lang.Thread.run(Thread.java:764) at com.bumptech.glide.load.engine.executor.GlideExecutor$DefaultThreadFactory$1.run(GlideExecutor.java:446) 07-30 20:51:35.127 18903-18903/com.example.muhammadusman.project D/MyMessage: Again loading 07-30 20:51:37.842 1397-1397/? W/audio_hw_generic: Not supplying enough data to HAL, expected position 58480553 , only wrote 58327920 07-30 20:51:38.041 18903-18903/com.example.muhammadusman.project W/Glide: Load failed for http://10.0.2.2:5000/image/tmpqklezoyk.png with size [368x268] class com.bumptech.glide.load.engine.GlideException: Failed to load resource There was 1 cause: java.io.FileNotFoundException(No content provider: http://10.0.2.2:5000/image/tmpqklezoyk.png) call GlideException#logRootCauses(String) for more detail Cause (1 of 1): class com.bumptech.glide.load.engine.GlideException: Fetching data failed, class android.content.res.AssetFileDescriptor, LOCAL, DataCacheKey{sourceKey=http://10.0.2.2:5000/image/tmpqklezoyk.png, signature=EmptySignature} There was 1 cause: java.io.FileNotFoundException(No content provider: http://10.0.2.2:5000/image/tmpqklezoyk.png) call GlideException#logRootCauses(String) for more detail Cause (1 of 1): class java.io.FileNotFoundException: No content provider: http://10.0.2.2:5000/image/tmpqklezoyk.png 07-30 20:51:38.041 18903-18903/com.example.muhammadusman.project I/Glide: Root cause (1 of 1) java.io.FileNotFoundException: No content provider: http://10.0.2.2:5000/image/tmpqklezoyk.png at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1396) at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1247) at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1170) at com.bumptech.glide.load.data.AssetFileDescriptorLocalUriFetcher.loadResource(AssetFileDescriptorLocalUriFetcher.java:22) at com.bumptech.glide.load.data.AssetFileDescriptorLocalUriFetcher.loadResource(AssetFileDescriptorLocalUriFetcher.java:13) at com.bumptech.glide.load.data.LocalUriFetcher.loadData(LocalUriFetcher.java:44) at com.bumptech.glide.load.engine.SourceGenerator.startNext(SourceGenerator.java:62) at com.bumptech.glide.load.engine.DecodeJob.runGenerators(DecodeJob.java:299) at com.bumptech.glide.load.engine.DecodeJob.runWrapped(DecodeJob.java:269) at com.bumptech.glide.load.engine.DecodeJob.run(DecodeJob.java:230) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) at java.lang.Thread.run(Thread.java:764)
最佳答案
这是图书馆 Weak Handler
1.将这个库添加到build.gradle文件中。
2.代码如下。
代码
public static void LoadNetworkImage(final Context context, final ImageView imageView, final String imageUrl) {
final WeakHandler mHandler = new WeakHandler();
final Runnable runnable = new Runnable() {
@Override
public void run() {
LoadNetworkImage(context, imageView,imageUrl);
}
};
Glide.with(context).
load(imageUrl).
transition(DrawableTransitionOptions.withCrossFade()).
listener(new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
mHandler.postDelayed(runnable,1);
return true;
}
@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
return false;
}
}).
into(imageView);
}
注意 如果您的图像加载失败,则此代码将在 1 MiiliSecond 失败后发送请求。仅因为您说过该资源存在,这对您的情况最有效。
警告 但如果资源不存在,那么这不是最佳解决方案。因为递归会无限进行下去。
关于android - 如果 Glide 失败,如何重试图像加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51595360/