如果Glide加载失败,如何重试图片加载?

8
我正在使用这段代码从网络加载图像。
由于同时进行了多个请求,因此会出现“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);
    }

我已经阅读了这个讨论如何在Glide失败时重试图片加载?,但是没有帮助。 错误日志 类 com.bumptech.glide.load.engine.GlideException: 加载资源失败 有1个原因: java.io.FileNotFoundException(没有内容提供程序: http://10.0.2.2:5000/image/tmpfhpbjdsf.png) 调用GlideException#logRootCauses(String)以获取更多详细信息 原因(共1个):类com.bumptech.glide.load.engine.GlideException: 获取数据失败, 类android.content.res.AssetFileDescriptor, LOCAL, DataCacheKey {sourceKey=http://10.0.2.2:5000/image/tmpfhpbjdsf.png, signature=EmptySignature} 有1个原因: java.io.FileNotFoundException(没有内容提供程序:http://10.0.2.2:5000/image/tmpfhpbjdsf.png) 调用GlideException#logRootCauses(String)以获取更多详细信息 原因(共1个):类java.io.FileNotFoundException: 没有内容提供程序:http://10.0.2.2:5000/image/tmpfhpbjdsf.png 07-30 20:51:35.127 18903-18903/com.example.muhammadusman.project I/Glide: 根本原因(1/1) java.io.FileNotFoundException:没有内容提供程序:http://10.0.2.2:5000/image/tmpfhpbjdsf.png 在android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1396) 在android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1247) 在android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1170) 在com.bumptech.glide.load.data.AssetFileDescriptorLocalUriFetcher.loadResource(AssetFileDescriptorLocalUriFetcher.java:22) 在com.bumptech.glide.load.data.AssetFileDescriptorLocalUriFetcher.loadResource(AssetFileDescriptorLocalUriFetcher.java:13) 在com.bumptech.glide.load.data.LocalUriFetcher.loadData(LocalUriFetcher.java:44) 在com.bumptech.glide.load.engine.SourceGenerator.startNext(SourceGenerator.java:62) 在com.bumptech.glide.load.engine.DecodeJob.runGenerators(DecodeJob.java:299) 在com.bumptech.glide.load.engine.DecodeJob.runWrapped(DecodeJob.java:269) 在com.bumptech.glide.load.engine.DecodeJob.run(DecodeJob.java:230) 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) 在java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) 在java.lang.Thread.run(Thread.java:764) 在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: 再次加载 07-30 20:51:37.842 1397-1397/? W/audio_hw_generic:没有向HAL提供足够的数据,期望位置为58480553,只写了58327920 07-30 20:51:38.041 18903-18903/com.example.muhammadusman.project W/Glide: 大小为[368x268]的http://10.0.2.2:5000/image/tmpqklezoyk.png加载失败 类com.bumptech.glide.load.engine.GlideException: 加载资源失败 有1个原因: java.io.FileNotFoundException(没有内容提供程序: http://10.0.2.2:5000/image/tmpqklezoyk.png) 调用GlideException#logRootCauses(String)以获取更多详细信息 原因(共1个):类com.bumptech.glide.load.engine.GlideException: 获取数据失败, 类android.content.res.AssetFileDescriptor, LOCAL, DataCacheKey {sourceKey=http://10.0.2.2:5000/image/tmpqklezoyk.png, signature=EmptySignature} 有1个原因: java.io.FileNotFoundException(没有内容提供程序:http://10.0.2.2:5000/image/tmpqklezoyk.png) 调用GlideException#logRootCauses(String)以获取更多详细信息 原因(共1个):类java.io.FileNotFoundException: 没有内容提供程序: http://10.0.2.2:5000/image/tmpqklezoyk.png 07-30 20:51:38.041 18903-18903/com.example.muhammadusman.project I/Glide:

https://dev59.com/LpTfa4cB1Zd3GeqPNC-L - AskNilesh
https://dev59.com/-Jjga4cB1Zd3GeqPObkT - AskNilesh
展示你的日志和服务器端代码? - Muhammad Usman
1个回答

4

这是库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。这只会在您已确认资源存在的情况下发挥最佳作用。
警告:但是,如果资源不存在,则这不是最佳解决方案。因为递归将无限进行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接