2010-06-19 17 views
5

Tengo un archivo de datos grande, que está comprimido, y aproximadamente 20 MB. Cuando se descomprime, es hasta aproximadamente 50 MB. El siguiente código fuente funciona bien. Encontré el original en la web en otro lugar y lo modifiqué un poco. Y este método se llama dentro de AsyncTask.doInBackground.¿Cómo debo descomprimir un archivo de datos grande en AsyncTask.doInBackground?

Entonces, lo que quiero saber es cómo puedo guardar el estado actual (lo siento, no sé la palabra correcta en inglés) y reanudo el procedimiento más tarde. Quiero decir, este método lleva un poco de tiempo (alrededor de un minuto en un emulador), y sé que no hay forma, ya que los datos son enormes. Entonces, si se mata una actividad principal de este método, quiero guardar el estado actual de descompresión del archivo, y cuando la actividad se active, quiero reanudar la descompresión desde el último punto. Espero que mi explicación aclare mi intención.

Estaba pensando en usar un servicio, pero también quiero interactuar con la interfaz de usuario, como mostrar un progreso o lo que sea. No puedo encontrar buena información para hacer eso en el servicio cuando escaneo aproximadamente la referencia, pero ¿hay alguna manera de hacerlo en el servicio? ¿Y crees que debería usarlo?

De todos modos, mi punto principal es cómo reanudar la descompresión de un archivo.

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(); 
     } 
    } 
}  

Gracias de antemano, yokyo

+2

+1 para compartir el código – Pentium10

+0

¡Gracias por compartir el código! ¡He estado buscando esto durante mucho, mucho tiempo! – Force

Respuesta

2

Por lo tanto, si una actividad principal de este método es asesinado, Quiero salvar el estado actual de descomprimir el archivo , y cuando la actividad obtiene activo, quiero reanudar la descompresión del último punto.

Eso será extremadamente difícil, si no imposible.

estaba pensando usar un servicio, pero también quieren interactuar con la interfaz de usuario, tales como mostrando un progreso o lo que sea.

Este es un buen plan. Simplemente haga que la actividad registre un oyente con el servicio, y el servicio llama a ese oyente para "un progreso o lo que sea".

+0

Gracias por su respuesta, Mark. > Eso será extremadamente difícil, si no imposible. Realmente lo pensé porque no pude encontrar ninguna muestra de eso. > Simplemente haga que la actividad registre un oyente con el servicio, y el servicio llama a ese oyente para "un progreso o lo que sea" Haré este enfoque más profundo. Gracias –

Cuestiones relacionadas