我有一个应用程序,其中包含一堆小图像(大约 200 张图像)(总大小约 10MB),可以在不同情况下显示在屏幕上。当用户按下某个按钮时,会显示这些图像之一(可以是其中任何一个)。将来的任何时候都可能添加更多图像,因此应用程序会检查服务器上的 xml 文档(如果距离上次检查已过去至少 24 小时,则此检查在主 Activity 的 onCreate() 中完成)。 xml 文档列出了所有图像,因此可以轻松检查文档是否已更改以及是否添加了新图像。如果添加了更多图像,应用程序将从服务器下载这些图像,并将它们与设备上已存在的图像一起存储。
我的第一个想法是将 10MB 的图像与应用程序 bundle 在一起,将它们放入 Assets 文件夹中,应用程序第一次启动时,图像将从 Assets 文件夹移动到内部存储。然后,如果将来要添加更多图像,它们也会被下载并保存在内部存储中,因此所有图像都很好地拼凑在一起,但是经过一些实验后,我发现这需要很多时间设备的时间(在运行 Android 4.1 的 HTC One S 上进行测试)只是列出 Assets 文件夹中的图像(超过一分钟),更不用说实际复制它们了。这是 Not Acceptable ,因为我不希望用户第一次体验应用程序的等待时间超过一分钟。
我正在使用 AssetManager 类的 list(String path) 方法来列出文件。
所以我想我的问题是:
您将如何实现这一点,以便用户在首次启动时不必等待很长时间,并且应用程序仍然能够动态下载更多图像?
最佳答案
我有一个类似的情况,我将所有文件压缩在一个 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);
}
}
关于android - 将文件与 Android 应用程序 bundle 在一起,并允许稍后进行其他下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17218697/