使用Android应用程序捆绑文件,以后可以进行额外下载

时间:2013-06-20 16:16:56

标签: android android-assets

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

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

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

所以我想我的问题是:

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

1 个答案:

答案 0 :(得分: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);
    }

}