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
+1 để chia sẻ mã – Pentium10
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