2010-06-19 77 views
5

我有一个大的数据文件,它是压缩的,大约20MB。解压缩后,大约可达50MB。以下源代码工作正常。我在其他地方发现了网页上的原创内容,并对其进行了一些修改。这个方法在AsyncTask.doInBackground中被调用。我应该如何解压缩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

+2

+1分享代码 – Pentium10 2010-06-19 07:55:03

+0

感谢分享代码!我一直在寻找这个很长很长的时间! – Force 2011-12-08 22:16:45

回答

2

因此,如果此方法 就会被杀死的主要活动,我想保存解压 文件的 当前状态,而当活动获得 活跃,我想从最后一点恢复解压 。

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

我使用的是服务思想,但我也 想与UI交互,如 显示进度或什么的。

这是一个很好的计划。只需让该活动向该服务注册一个侦听器,然后该服务将该侦听器称为“进度或其他”。

+0

谢谢你的回复,马克。 >这将是非常困难的,如果不是不可能的话。 我其实是这么想的,因为我找不到它的任何样本。 >只要有活动向服务注册一个监听器,并且该服务将该监听器称为“进度或其他” 我会更深入地挖掘此方法。谢谢 – 2010-06-19 12:23:46