¿Cómo descomprimir un archivo de datos grande en AsyncTask.doInBackground?

Tengo un archivo de datos grande, que es comprimido, y aproximadamente 20MB. Cuando se descomprime, es de hasta unos 50 MB. El código fuente siguiente funciona correctamente. Encontré el original en la tela en alguna parte y lo modificó un pedacito. Y este método se llama dentro del AsyncTask.doInBackground.

Por lo tanto, lo que quiero saber es, ¿cómo puedo guardar el estado en curso (? Perdón, no sé la palabra en inglés adecuada) y reanudar el procedimiento más tarde? Quiero decir, este método tarda un poco largo tiempo (alrededor de un minuto en un emulador), y sé que no hay manera ya que los datos son un poco grandes. Por lo tanto, si una actividad principal de este método se pierde, quiero guardar el estado actual de descomprimir el archivo, y cuando la actividad se activa, quiero reanudar la descompresión desde el último punto. Espero que mi explicación despeje mi intención.

Yo 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 la referencia, pero ¿hay una 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

Por lo tanto, si una actividad principal de este método se pierde, quiero guardar el estado actual de descomprimir el archivo, y cuando la actividad se activa, quiero reanudar la descompresión desde el último punto.

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

Yo estaba pensando en usar un servicio, pero también quiero interactuar con la interfaz de usuario, como mostrar un progreso o lo que sea.

Este es un buen plan. Sólo tiene la actividad de registro de un oyente con el servicio, y el servicio llama a ese oyente para "un progreso o lo que sea".

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.