【问题标题】:How to load many of images from server in android fast?如何快速从android中的服务器加载许多图像?
【发布时间】:2019-01-22 06:54:09
【问题描述】:

我开发了一个 android 壁纸应用程序,其中有很多壁纸图片,大约 200 张壁纸(高尺寸图片)。我正在为此使用 rest api 和改造库,但我的应用程序加载它很慢,现在我想让它更快地加载所有壁纸。让我的应用程序更快的最佳方法?

【问题讨论】:

  • 使用 Glide 加载图片可能很快。
  • 你试过分页吗?
  • 使用低分辨率图片、缓存图片、预加载图片、并发加载图片、按需加载图片、本地存储图片
  • 我已经使用 glide 加载图像,但应用程序仍然很慢。因为图像的分辨率很高,几乎是一张图像的 2 mb

标签: android rest retrofit wallpaper


【解决方案1】:

当我需要加载大量图片时,我遇到了类似的问题。使用带有缓存的 Glide,但它又很慢。 Glide 缓存不稳定,有时它会删除图像并重新下载它们。所以我下载了所有图像手动缓存,然后使用 Glide 加载它们。它的速度要快得多。

这里是提示。

下载图片到cacheDir并保存位置

public static String downloadFile(Activity activity, String fileURL, String fileName, String type) {
        File folder = new File(activity.getCacheDir() + "/dg/");
        folder.mkdirs();
        String rootDir = folder.getAbsolutePath() + "/" + fileName;
        try {
            File rootFile = new File(rootDir);
            if (rootFile.exists()) {
                System.out.println("VIDEO/IMAGE EXISTS:  " + fileName);
                return rootDir;
            }
            URL url = new URL(fileURL);
            HttpURLConnection ucon = (HttpURLConnection) url.openConnection();
            InputStream is = ucon.getInputStream();
            BufferedInputStream inStream = new BufferedInputStream(is, 1024 * 5);
            FileOutputStream outStream = new FileOutputStream(rootFile);
            byte[] buff = new byte[5 * 1024];

            //Read bytes (and store them) until there is nothing more to read(-1)
            int len;
            while ((len = inStream.read(buff)) != -1) {
                outStream.write(buff, 0, len);
            }

            //clean up
            outStream.flush();
            outStream.close();
            inStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return rootDir;
    }

然后在启动画面中使用 (GlideApp) 加载它们可能吗?或分页。

 GlideApp
                .with(activity)
                .load(new File(activity.getCacheDir() + "/dg/" + name))
                .diskCacheStrategy(DiskCacheStrategy.DATA)
                .into(imageView);

【讨论】:

  • 完美我希望这种方法对我有帮助。让我试试看
  • 如果它也对你有用,请在此处告知,以便其他人也能受益
【解决方案2】:

1) 使用一些好的图像加载库,例如 PicassoGlide。 这些库以最少的工作量提供了良好的图像缓存功能。

2) 尝试为列表或网格中的缩略图加载较小尺寸的图像,并且仅当用户希望通过单击缩略图查看完整图像时才加载高分辨率图像。

3) 使用分页,最初显示一些图像,比如 20 张图像,然后当用户向下滚动到列表底部时获取下 20 张图像,依此类推。

【讨论】:

  • 是的,我正在这样做,兄弟,我在每个类别中只显示 20 张图片,但由于分辨率高,速度很慢
  • 要求您的服务器向您发送一份低分辨率副本以供列表。
【解决方案3】:

您可以使用 Glide 加载图像

  1. 如果 mavenCentral() 不是由 android studio 依赖项在 build.gradle 项目中自动添加的,则添加 mavenCentral()。
    mavenCentral()

  2. 然后将以下依赖项添加到 build.gradle app 模块中。
    实施 'com.github.bumptech.glide:glide:4.12.0' 注释处理器 'com.github.bumptech.glide:compiler:4.12.0'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    相关资源
    最近更新 更多