2

我有一个带有一堆小图像(大约 200 张图像)(总大小约为 10MB)的应用程序,可以在不同情况下显示在屏幕上。当用户按下某个按钮时,会显示其中一个图像(可能是其中的任何一个)。在未来的任何时候,可能会添加更多图像,因此应用程序会检查服务器上的 xml 文档(如果距上次检查至少 24 小时,则此检查在主要活动的 onCreate() 中完成)。xml 文档列出了所有图像,因此很容易检查文档是否已更改以及是否添加了新图像。如果添加了更多图像,应用程序将从服务器下载这些图像,并将它们与设备上已经存在的图像一起存储。

我的第一个想法是将 10MB 的图像与应用程序捆绑在一起,将它们放在 assets 文件夹中,当应用程序第一次启动时,图像将从 assets 文件夹移动到内部存储。然后如果以后要添加更多的图像,它们也会被下载并保存在内部存储中,所以所有图像都很好地拉在一起,但是经过一些实验,我发现这需要很多设备(在带有 Android 4.1 的 HTC One S 上测试)的时间只是列出资产文件夹中的图像(超过一分钟),更不用说实际复制它们了。这是不可接受的,因为我不希望用户对应用程序的首次体验超过一分钟的等待时间。

我正在使用 AssetManager 类的 list(String path) 方法来列出文件。

所以我想我的问题是:

您将如何以某种方式实现这一点,以便用户在第一次启动时不必等待很长时间,并且应用程序仍然能够即时下载更多图像?

4

1 回答 1

3

我有一个类似的场景,我将所有文件压缩到一个 zip 中并将其存储在 res/raw 文件夹中。然后在第一次启动时,我将所有文件提取到应用程序的内部存储中。

public static void unzipFiles(Context context, int file) {
    InputStream stream;

    context.getFilesDir().mkdirs();
    String path = context.getFilesDir().getAbsolutePath();

    try {
        stream = context.getResources().openRawResource(file);
        if (stream == null) {
            throw new RuntimeException("Cannot load " + file + " file from raw folder");
        }

        ZipInputStream zis = new ZipInputStream(stream);
        ZipEntry entry;

        while ((entry = zis.getNextEntry()) != null) {
            if (entry.isDirectory()) {
                File f = new File(path, entry.getName());
                if (!f.exists()) {
                    f.mkdirs();
                }
            } else {
                int size;
                byte[] buffer = new byte[2048];

                File f = new File(path, entry.getName());
                FileOutputStream fos = new FileOutputStream(f);
                BufferedOutputStream bos = new BufferedOutputStream(fos, buffer.length);

                while ((size = zis.read(buffer, 0, buffer.length)) != -1) {
                    bos.write(buffer, 0, size);
                }
                bos.flush();
                bos.close();
            }
        }

    } catch (IOException e) {
        throw new RuntimeException("Cannot unzip '" + file + "'", e);
    }

}
于 2013-06-20T17:27:03.480 回答