0

GZIPファイルを解凍するジョブを実行しているAsyncTaskがあります。 AsyncTasksの進捗状況を公開し、以前作成した他のAsyncTasksでこれを正常に動作させることができたことを知りました。これを行うには、2つの重要な値、最大値と現在の進捗値が必要であることを理解しています。GZIP解凍中にProgressBar maxValueとpublishProgress値を設定します

問題は、入力ストリームからこれらの値を取得する方法がわかりません。私の現在のAsyncTaskは、次のようになります。私は私が値を見つける必要があると考えているが、ここでいくつかの助けを必要とする私のコードにコメントしました

package com.wizzkidd.myapp.asynctasks; 

import android.content.Context; 
import android.os.AsyncTask; 
import android.util.Log; 
import android.view.View; 
import android.widget.ProgressBar; 

import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.zip.GZIPInputStream; 

public class DecompressGzipAsync extends AsyncTask<String, Integer, Boolean> { 

    ProgressBar progressBar; 
    private Context _context; 
    private View _view; 
    private String _compressedFilePath; 
    private String _uncompressedFilePath; 

    public DecompressGzipAsync(Context context, View view, String compressedFilePath) { 
     this._context = context; 
     this._view = view; 
     this._compressedFilePath = compressedFilePath; 
     this._uncompressedFilePath = compressedFilePath.substring(0, compressedFilePath.lastIndexOf(".")); //path + filename without gz extension 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected Boolean doInBackground(String... strings) { 
     Boolean isSuccess = false; 
     byte[] buffer = new byte[1024]; 
     try { 
      GZIPInputStream gzis = new GZIPInputStream(new FileInputStream(_compressedFilePath)); 
      FileOutputStream out = new FileOutputStream(_uncompressedFilePath); 
      //FIXME: I think I need the file size here? 
      //progressBar.setMax(???); 
      int len; 
      while ((len = gzis.read(buffer)) > 0) { 
       out.write(buffer, 0, len); 
       //FIXME: I'm not sure what incrementing value can I put in here? 
       //publishProgress(???); 
      } 
      gzis.close(); 
      out.close(); 
      isSuccess = true; 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
     return isSuccess; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     super.onProgressUpdate(values); 
     int currentValue = values[0]; 
     int maxValue = progressBar.getMax(); 
     Log.v("TAG", "Decompressing Progress... currentValue: " + currentValue + " | maxValue: " + maxValue); 
    } 

    @Override 
    protected void onPostExecute(Boolean result) { 
     super.onPostExecute(result); 
     if (result) { 
      Log.v("TAG", "Decompressing - Completed"); 
     } else { 
      Log.v("TAG", "Decompressing - Failed"); 
     } 
    } 
} 

。どんな助けもありがとうございます。

答えて

0

this postによれば、ファイルの最後の4バイトには圧縮されていないファイルサイズが含まれています(これは4GBの制限を意味します)。

だから、これは動作するはずです:

@Override 
    protected Boolean doInBackground(String... strings) { 
     Boolean isSuccess = false; 
     byte[] buffer = new byte[1024]; 
     try { 
      RandomAccessFile raf = new RandomAccessFile(new File(_compressedFilePath), "r"); 
      raf.seek(raf.length() - 4); 
      int b4 = raf.read(); 
      int b3 = raf.read(); 
      int b2 = raf.read(); 
      int b1 = raf.read(); 
      int uncompressedSize = ((0xFF & b1) << 24) | ((0xFF & b2) << 16) | 
        ((0xFF & b3) << 8) | (0xFF & b4); 
      raf.close(); 

      GZIPInputStream gzis = new GZIPInputStream(new FileInputStream(_compressedFilePath)); 
      FileOutputStream out = new FileOutputStream(_uncompressedFilePath); 
      int count = 0; 
      int len; 
      while ((len = gzis.read(buffer)) > 0) { 
       out.write(buffer, 0, len); 
       count += len; 
       publishProgress(count, uncompressedSize); 
      } 
      gzis.close(); 
      out.close(); 
      isSuccess = true; 
     } catch (IOException ex) { 
      Log.e("DecompressGzipAsync", "error unzipping file", ex); 
     } 
     return isSuccess; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     super.onProgressUpdate(values); 
     int count = values[0]; 
     int uncompressedSize = values[1]; 
     int maxValue = progressBar.getMax(); 
     int progress = (int) ((float) count/(float) uncompressedSize * maxValue); 
     if (progress > maxValue) progress = maxValue; // sanity check 
     progressBar.setProgress(progress); 
     Log.v("DecompressGzipAsync", "Decompressing Progress... currentValue: " + progress + " | maxValue: " + maxValue); 
    } 
+0

をあなたがいないだけ@krisあなたはさらに行って、私の既存のコードの中に答えを実装した、答えを提供していますありがとうございます。今はスプーンの摂食ではない場合、私は何がわからない。とても有難い! – WizzKidd

+0

たくさんのコードをコピーして貼り付け、いくつかの行を変更するとき、私はそれをしてくれてうれしいです。 :) –

関連する問題