2010-06-19 30 views
5

Tôi có một tệp dữ liệu lớn, được nén và khoảng 20MB. Khi nó được giải nén, nó lên đến khoảng 50MB. Mã nguồn sau hoạt động tốt. Tôi tìm thấy bản gốc trên web ở một nơi khác và sửa đổi nó một chút. Và phương thức này được gọi trong AsyncTask.doInBackground.Làm cách nào để giải nén tệp dữ liệu lớn trong AsyncTask.doInBackground?

Vì vậy, điều tôi muốn biết là, làm cách nào để tôi có thể lưu trạng thái đang diễn ra (? Xin lỗi, tôi không biết từ tiếng Anh thích hợp) và tiếp tục quy trình sau? Tôi có nghĩa là, phương pháp này mất một thời gian dài (khoảng một phút trên một trình giả lập), và tôi biết không có cách nào vì dữ liệu là rất lớn. Vì vậy, nếu một hoạt động chính của phương pháp này bị giết, tôi muốn lưu trạng thái hiện tại của giải nén tập tin, và khi hoạt động được kích hoạt, tôi muốn tiếp tục giải nén từ điểm cuối cùng. Hy vọng lời giải thích của tôi sẽ xóa đi ý định của tôi.

Tôi đã nghĩ đến việc sử dụng dịch vụ, nhưng tôi cũng muốn tương tác với giao diện người dùng, chẳng hạn như hiển thị tiến trình hoặc bất kỳ điều gì. Tôi không thể tìm thấy thông tin tốt để thực hiện điều đó trong dịch vụ khi tôi quét toàn bộ tham chiếu, nhưng có cách nào để thực hiện điều đó trong dịch vụ không? Và bạn có nghĩ rằng tôi nên sử dụng nó?

Dù sao, điểm chính của tôi là cách tiếp tục giải nén tệp.

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

Cảm ơn trước, yokyo

+2

+1 để chia sẻ mã – Pentium10

+0

Cảm ơn bạn đã chia sẻ mã! Tôi đã tìm kiếm điều này một thời gian dài! – Force

Trả lời

2

Vì vậy, nếu một hoạt động chính của phương pháp này bị giết, tôi muốn lưu trạng thái hiện thời của giải nén các tập tin , và khi hoạt động được kích hoạt , tôi muốn tiếp tục giải nén từ điểm cuối cùng.

Điều đó sẽ vô cùng khó khăn, nếu không phải là không thể.

Tôi đã nghĩ đến việc sử dụng dịch vụ, nhưng tôi cũng muốn tương tác với giao diện người dùng, chẳng hạn như hiển thị tiến trình hoặc bất kỳ điều gì.

Đây là gói tiền phạt. Chỉ cần có hoạt động đăng ký người nghe với dịch vụ và dịch vụ gọi người nghe đó là "tiến trình hoặc bất kỳ điều gì".

+0

Cảm ơn bạn đã trả lời, Mark. > Điều đó sẽ vô cùng khó khăn, nếu không phải là không thể. Tôi thực sự nghĩ như vậy vì tôi không thể tìm thấy bất kỳ mẫu của nó. > Chỉ cần có hoạt động đăng ký người nghe với dịch vụ và dịch vụ gọi người nghe đó là "tiến trình hoặc bất cứ điều gì" Tôi sẽ đào sâu hơn phương pháp này. Cảm ơn –

Các vấn đề liên quan