我有一个应用程序,附带一堆小图像(约200张图像)(总大小约10MB),在不同情况下显示在屏幕上。当用户按下某个按钮时,将显示其中一个图像(可以是其中任何一个)。在将来的任何时候,可能会添加更多图像,因此应用程序会检查服务器上的xml文档(如果自上次检查完成后至少24小时,则此检查在主活动的onCreate()中完成)。 xml文档列出了所有图像,因此很容易检查文档是否已更改并添加了新图像。如果添加了更多图像,应用程序将从服务器下载这些图像,并将它们与设备上已存在的图像一起存储。
我的第一个想法是将10MB图像与应用程序捆绑在一起,将它们放在资源文件夹中,第一次启动应用程序时,图像将从资源文件夹移动到内部存储。然后,如果将来要添加更多图像,它们将被下载并保存在内部存储器中,因此所有图像都很好地拉在一起,但经过一些实验后,我发现它需要大量的设备的时间(使用Android 4.1在HTC One S上测试)只是为了列出资产文件夹中的图像(超过一分钟),更不用说实际复制它们了。这是不可接受的,因为我不希望用户第一次体验应用程序超过一分钟的等待时间。
我正在使用AssetManager类的list(String path)方法列出文件。
所以我想我的问题是:
你将如何以某种方式实现这一点,以便用户不必在第一次启动时等待很长时间,并且应用程序仍然可以动态下载更多图像?
答案 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);
}
}