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
+1 para compartir el código – Pentium10
¡Gracias por compartir el código! ¡He estado buscando esto durante mucho, mucho tiempo! – Force