Glide加载图片出现超时问题

不羁的心 提交于 2019-12-15 07:56:15

在使用Glide加载图片的时候不知道你有没有遇到过第一次加载图片总是失败,试个10次有7,8次失败,通过日志能看到以下问题:在这里插入图片描述
这种问题明显看出来是加载超时,那么为什么会出现这种问题呢,为什么项目中其他地方的图片加载没问题呢,第一直觉是图片地址问题,换了另外一个图片地址果然解决了,但是很多项目中图片地址都是更换不了的,那么总结一下我所试过的解决方法:

1:使用okhttp或volley作为网络栈

这种方法是网上最常见的解决方法,既:在gradle文件中增加一下代码

compile 'com.github.bumptech.glide:okhttp3-integration:1.4.0@aar'

@aar会将meta data数据自动导入androidmanifest,如果你的没有自动导入需要手动在AndroidManifest.xml文件中增加以下代码:

<meta-data
    android:name="com.bumptech.glide.integration.okhttp.OkHttpGlideModule"
    android:value="GlideModule" />

如果你的项目增加了混淆还需要在proguard文件增加混淆配置:

-keep class com.bumptech.glide.integration.okhttp3.OkHttpGlideModule

这样所有的配置就完成了,你可以运行下有没有解决你的图片加载问题!如果方法没有解决那么来看第二种方法。

2:使用AsyncTask

这种方法只适合整个项目其他位置的图片都没问题,就只有极个别的图片有问题的时候可以临时解决一下,直接上代码:

class MyTask extends AsyncTask<String, Integer, Bitmap> {
        private String pathUrl;
        public MyTask(String pathUrl){
            this.pathUrl = pathUrl;
        }


        @Override
        protected Bitmap doInBackground(String... params) {
            String path = pathUrl;
            ByteArrayOutputStream outputStream = null;
            try {
                URL url = new URL(path);
                //开启连接
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setReadTimeout(5000);
                conn.connect();
                if (conn.getResponseCode() == 200) {
                    InputStream inputStream = conn.getInputStream();
                    outputStream = new ByteArrayOutputStream();
                    byte[] bt = new byte[8 * 1024];
                    int len = 0;
                    while ((len = inputStream.read(bt)) != -1) {
                        outputStream.write(bt, 0, len);
                        outputStream.flush();
                    }
                    byte[] array = outputStream.toByteArray();
                    return BitmapFactory.decodeByteArray(array, 0, array.length);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (outputStream != null) {
                    try {
                        outputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return null;
        }

        @Override
        protected void onPostExecute(Bitmap result) {
            super.onPostExecute(result);
            if (result != null) {
                civ_cardshare_head.setImageBitmap(result);
            }
        }
    }

在需要的地方写入以下代码调用一下即可:

new MyTask(businessCard.headurl).execute();

这样便完成了,但是用的时候注意一下AsyncTask有可能会引起内存泄漏;

3:可以找后端的小伙伴看看能不能做一下图片的优化,或者使用其他的图片加载框架比如:Picasso,Fresco等等,它们都各有自己的优缺点可以学习下!

以上便是所有的心得,大家有更好的方法可以留言告诉我哦!咯咯咯~~

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!