我要在Android应用程序中加载多个图像,但是我的应用程序加载速度却很慢?

时间:2019-01-22 06:54:10

标签: android rest retrofit wallpaper

我已经开发了一个Android壁纸应用,其中包含200张左右的墙纸(高尺寸图像)。我为此使用了REST API和翻新库,但我的应用程序现在加载缓慢,因此我想使其更快地加载所有墙纸。有什么最佳方法可以使我的应用程序更快?

2 个答案:

答案 0 :(得分:0)

1)使用一些好的图像加载库,即PicassoGlide。 这些库以最小的努力提供了良好的图像缓存功能。

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

3)使用分页,最初显示一些图像,例如20张图像,并在用户向下滚动到列表底部等时获取下20张图像。

答案 1 :(得分:0)

当我需要加载很多图片时,我遇到了类似的问题。结合使用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);