Как распаковать большой файл данных в AsyncTask.doInBackground? - PullRequest
5 голосов
/ 19 июня 2010

У меня есть большой файл данных в сжатом виде, размером около 20 МБ. Когда он распакован, он занимает около 50 МБ. Следующий исходный код работает нормально. Я нашел оригинал в Интернете где-то еще и немного изменил его. И этот метод вызывается внутри AsyncTask.doInBackground.

Итак, я хочу знать, как я могу сохранить текущий статус (извините, я не знаю правильного английского слова) и возобновить процедуру позже? Я имею в виду, что этот метод занимает немного много времени (около минуты на эмуляторе), и я знаю, что это невозможно, так как данные огромны. Итак, если основное действие этого метода будет уничтожено, я хочу сохранить текущее состояние распаковки файла, а когда действие станет активным, я хочу возобновить распаковку с последней точки. Надеюсь, мое объяснение прояснит мои намерения.

Я думал об использовании службы, но я также хочу взаимодействовать с пользовательским интерфейсом, таким как отображение прогресса или чего-то еще. Я не могу найти хорошую информацию для этого в сервисе, когда я грубо сканирую ссылку, но есть ли способ сделать это в сервисе? И вы думаете, я должен использовать это?

В любом случае, моя главная мысль - как возобновить распаковку файла.

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

1 Ответ

2 голосов
/ 19 июня 2010

Итак, если основное занятие этого метода убивают, я хочу спасти Текущее состояние распаковки файл, и когда активность получает активный, я хочу возобновить распаковку с последней точки.

Это будет чрезвычайно сложно, если не невозможно.

Я думал об использовании службы, но я также хотите взаимодействовать с пользовательским интерфейсом, таким как показывая прогресс или что-то еще.

Это хороший план. Просто попросите активность зарегистрировать слушателя в службе, и служба вызывает этого слушателя для «прогресса или чего-то еще».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...