我有一个大型数据文件,它是压缩的,大约20MB。当它解压缩时,最高可达50MB。以下源代码工作正常。我在网上的其他地方找到了原版并修改了一下。并且在AsyncTask.doInBackground中调用此方法。
所以,我想知道的是,如何保存正在进行的状态(?对不起,我不知道正确的英文单词)并稍后恢复程序?我的意思是,这种方法需要很长时间(在模拟器上大约一分钟),而且我知道没有办法,因为数据有点大。因此,如果此方法的主要活动被杀死,我想保存解压缩文件的当前状态,并且当活动变为活动时,我想从最后一点恢复解压缩。希望我的解释清楚我的意图。
我在考虑使用服务,但我也希望与UI进行交互,例如显示进度或其他任何内容。当我粗略地扫描参考时,我在服务中找不到好的信息,但有没有办法在服务中做到这一点?你觉得我应该用吗?
无论如何,我的主要观点是如何恢复解压缩文件。
private final static int CHUNK_SIZE = 32 * 1024;
byte[] _fileIOBuffer = new byte[CHUNK_SIZE];
public void unzipFile(DBFileDownloader downloader, File zipFile, String directory)
throws IOException
{
ZipInputStream in = null;
FileOutputStream os = null;
try
{
in = new ZipInputStream (new FileInputStream(zipFile));
ZipEntry entry = null;
while ((entry = in.getNextEntry ())!= null)
{
String entryName = entry.getName();
if (entry.isDirectory ()) {
File file = new File (directory, entryName);
file.mkdirs();
}
else {
File file = new File(directory, entryName);
if (file.exists()){
file.delete(); // I don't know how to append, so delete it always
}
os = new FileOutputStream (file);
int bytesRead = 0;
while ((bytesRead = in.read (_fileIOBuffer))!= -1) {
os.write(_fileIOBuffer, 0, bytesRead);
// progress procedure
}
os.close();
}
}
}
catch (FileNotFoundException e) {
Log.v("unzip", e.getMessage());
}
catch (IOException e) {
Log.v("unzip", e.getMessage());
}
finally{
if (in != null ){
in.close();
}
if (os != null ){
os.close();
}
}
}
提前致谢, yokyo
答案 0 :(得分:2)
所以,如果这个方法的主要活动 被杀了,我想保存 解压缩的当前状态 文件,以及活动获得的时间 活跃,我想恢复解压缩 从最后一点开始。
如果不是不可能的话,这将是非常困难的。
我在想使用服务,但是我 也想与UI进行交互,例如 显示进展或其他任何事情。
这是一个很好的计划。只需让活动为服务注册一个监听器,服务就会调用该监听器的“进度或其他”。