我应该如何在AsyncTask.doInBackground中解压缩大型数据文件?

时间:2010-06-19 04:41:31

标签: android

我有一个大型数据文件,它是压缩的,大约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

1 个答案:

答案 0 :(得分:2)

  

所以,如果这个方法的主要活动   被杀了,我想保存   解压缩的当前状态   文件,以及活动获得的时间   活跃,我想恢复解压缩   从最后一点开始。

如果不是不可能的话,这将是非常困难的。

  

我在想使用服务,但是我   也想与UI进行交互,例如   显示进展或其他任何事情。

这是一个很好的计划。只需让活动为服务注册一个监听器,服务就会调用该监听器的“进度或其他”。