如何提升将多个图像从网络加载到 ImageViews

Posted

技术标签:

【中文标题】如何提升将多个图像从网络加载到 ImageViews【英文标题】:How to boost to load multiple images from web to ImageViews 【发布时间】:2020-08-16 16:59:17 【问题描述】:

为了从网站加载多张图片,编写了以下代码。

    public void connectImgtoView(final int max) 

        new Thread(new Runnable() 
            @Override
            public void run() 
                URL url = null;
                for (int i = 0; i < max; i++) 
                    try 
                        url = new URL(postImgUrl.get(i));
                     catch (MalformedURLException e) 
                        e.printStackTrace();
                    

                    try 
                        final BufferedInputStream bufferedInputStream
                                = new BufferedInputStream(url.openStream());
                        Bitmap bitmap = BitmapFactory.decodeStream(bufferedInputStream);
                        bufferedInputStream.close();

                        final Bitmap scaledBitmap = Bitmap.createScaledBitmap(
                                bitmap,
                                (int) (992),
                                (int) (1403),
                                true
                        );

                        final int finalI = i;
                        runOnUiThread(new Runnable() 
                            @Override
                            public void run() 
                                postImg[finalI].setImageBitmap(scaledBitmap);
                            
                        );
                     catch (IOException e) 
                        e.printStackTrace();
                    
                
                progressOFF();
            
        ).start();
    

这种方法虽然执行成功,但存在执行速度太慢的问题。

所以我想知道什么比这个方法更快。

请帮帮我。

变量描述

postImgUrl :类型是 ArrayList,这是包含我想要的图像的 url

postImg : type 是 ImageView Array,这是布局中存在的 ImageView。

【问题讨论】:

【参考方案1】:

尝试将 for 循环放在 Thread 的外侧,以便您可以同时实例化和处理多个 Threads

public void connectImgtoView(final int max) 
    for (int i = 0; i < max; i++) 
        new Thread(new Runnable() 
            @Override
            public void run() 
                URL url = null;
                    try 
                        url = new URL(postImgUrl.get(i));
                     catch (MalformedURLException e) 
                        e.printStackTrace();
                    

                    try 
                        final BufferedInputStream bufferedInputStream
                                = new BufferedInputStream(url.openStream());
                        Bitmap bitmap = BitmapFactory.decodeStream(bufferedInputStream);
                        bufferedInputStream.close();

                        final Bitmap scaledBitmap = Bitmap.createScaledBitmap(
                                bitmap,
                                (int) (992),
                                (int) (1403),
                                true
                        );

                        final int finalI = i;
                        runOnUiThread(new Runnable() 
                            @Override
                            public void run() 
                                postImg[finalI].setImageBitmap(scaledBitmap);
                            
                        );
                     catch (IOException e) 
                        e.printStackTrace();
                    
                progressOFF();
            
        ).start();
    

【讨论】:

以上是关于如何提升将多个图像从网络加载到 ImageViews的主要内容,如果未能解决你的问题,请参考以下文章

如何将图像文件加载到 ImageView?

Android:如何在不加载完整位图的情况下将流式图像即时渲染到 ImageView?

Android - 在显示进度时将图像从 URL 加载到 ImageView(不保存图像)

Android Lollipop 问题 - 无法将图像从相机加载到 ImageView

如何使用 Glide 将 svg 图像加载到图像视图

Android Glide 和 Firebase 存储:将连续图像从 Firebase 存储加载到 Imageview - 闪烁