2010-06-19 4 views
5

J'ai un grand fichier de données, qui est zippé, et environ 20 Mo. Quand il est décompressé, cela représente environ 50 Mo. Le code source suivant fonctionne correctement. J'ai trouvé l'original sur le web ailleurs et l'ai modifié un peu. Et cette méthode est appelée dans AsyncTask.doInBackground. Donc, ce que je veux savoir est, comment puis-je sauvegarder le statut en cours (? Désolé, je ne connais pas le mot anglais approprié) et reprendre la procédure plus tard? Je veux dire, cette méthode prend un peu de temps (environ une minute sur un émulateur), et je sais qu'il n'y a aucun moyen puisque les données sont assez énormes. Donc, si une activité principale de cette méthode est détruite, je veux enregistrer l'état actuel de la décompression du fichier, et quand l'activité est active, je veux reprendre la décompression du dernier point. J'espère que mon explication clarifie mon intention.Comment décompresser un gros fichier de données dans AsyncTask.doInBackground?

Je pensais utiliser un service, mais je veux aussi interagir avec l'interface utilisateur, comme montrer un progrès ou quoi que ce soit. Je ne peux pas trouver de bonnes informations pour faire cela dans le service lorsque je scanne grossièrement la référence, mais y a-t-il un moyen de le faire dans le service? Et pensez-vous que je devrais l'utiliser?

Quoi qu'il en soit, mon point principal est de savoir comment reprendre la décompression d'un fichier.

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

Merci à l'avance, yokyo

+2

+1 pour partager le code – Pentium10

+0

Merci de partager le code! Je l'ai cherché longtemps, très longtemps! – Force

Répondre

2

Ainsi, si une activité principale de cette méthode se fait tuer, je veux sauver le état actuel de décompressé le fichier , et lorsque l'activité obtient actif, je veux reprendre la décompression du dernier point.

Cela sera extrêmement difficile, voire impossible.

je pensais à l'aide d'un service, mais je veulent aussi interagir avec l'interface utilisateur, comme montrant un progrès ou autre chose.

Ceci est un bon plan. Il suffit que l'activité enregistre un écouteur avec le service, et le service appelle cet écouteur pour "une progression ou autre".

+0

Merci pour votre réponse, Mark. > Ce sera extrêmement difficile, voire impossible. Je pensais vraiment parce que je ne pouvais pas trouver des échantillons de celui-ci. > Il suffit que l'activité enregistre un écouteur avec le service, et le service appelle cet écouteur pour "une progression ou autre" Je vais approfondir cette approche. Merci –

Questions connexes