2013-03-19 4 views
1

파일을 암호화하는 동안 ProgressBar을 실행하고 싶습니다.진행률 표시 줄 업데이트 진행

다음 코드를 가지고 있지만 크기를 알 수 없거나 크기를 나누어서 어떻게 처리 할 수 ​​있습니까? 에서와 같이 암호화가 작동하는 동안 진행률 막대 %를 업데이트합니다.

저는 Android가 처음이므로 아직 모르는 부분이 많습니다. 아직 이해하고 있습니다. 당신이 CipherOutputStream에 쓰기 그래서 만약

import java.io.File; 

public class ProgressBarExa extends Activity { 

Button btnStartProgress; 
ProgressDialog progressBar; 
private int progressBarStatus = 0; 
private Handler progressBarHandler = new Handler(); 

// private long fileSize = 0; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.progressbar_view); 

    addListenerOnButton(); 

} 

public void addListenerOnButton() { 

    btnStartProgress = (Button) findViewById(R.id.btnStartProgress); 
    btnStartProgress.setOnClickListener(
      new OnClickListener() { 

     @Override 
     public void onClick(View v) { 

     // prepare for a progress bar dialog 
     progressBar = new ProgressDialog(v.getContext()); 
     progressBar.setCancelable(true); 
     progressBar.setMessage("File encrypting..."); 
     progressBar.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
     progressBar.setProgress(0); 
     progressBar.setMax(100); 
     progressBar.show(); 

     //reset progress bar status 
     progressBarStatus = 0; 

     //reset filesize 
     // fileSize = 0; 

     new Thread(new Runnable() { 
      public void run() { 
      while (progressBarStatus < 100) { 

       // process some tasks 
       progressBarStatus = doSomeTasks(); 

       // your computer is too fast, sleep 1 second 
       try { 
       Thread.sleep(1000); 
       } catch (InterruptedException e) { 
       e.printStackTrace(); 
       } 

       // Update the progress bar 
       progressBarHandler.post(new Runnable() { 
       public void run() { 
        progressBar.setProgress(progressBarStatus); 
       } 
       }); 
      } 

      // ok, file is downloaded, 
      if (progressBarStatus >= 100) { 

       // sleep 2 seconds, so that you can see the 100% 
       try { 
        Thread.sleep(2000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 

       // close the progress bar dialog 
       progressBar.dismiss(); 
      } 
      } 
      }).start(); 

      } 

      }); 

    } 

// file download simulator... a really simple 
public int doSomeTasks() { 

    try{ 
     String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath(); 
     String fileName = "a.wmv"; 
     String newFileNEE = "b.wmv"; 
     String newFileNED = "c.wmv"; 

     FileInputStream fis = new FileInputStream(new File(baseDir + File.separator + fileName)); 

     File outfile = new File(baseDir + File.separator + newFileNEE); 
      int read; 
      if(!outfile.exists()) 
       outfile.createNewFile(); 

      // long outfile_size = outfile.length(); 

      File decfile = new File(baseDir + File.separator + newFileNED); 
      if(!decfile.exists()) 
       decfile.createNewFile(); 


      FileOutputStream fos = new FileOutputStream(outfile); 
      FileInputStream encfis = new FileInputStream(outfile); 
      FileOutputStream decfos = new FileOutputStream(decfile); 

      Cipher encipher = Cipher.getInstance("AES"); 
      Cipher decipher = Cipher.getInstance("AES"); 

      KeyGenerator kgen = KeyGenerator.getInstance("AES"); 
      SecretKey skey = kgen.generateKey(); 
      encipher.init(Cipher.ENCRYPT_MODE, skey); 
      CipherInputStream cis = new CipherInputStream(fis, encipher); 
      decipher.init(Cipher.DECRYPT_MODE, skey); 
      CipherOutputStream cos = new CipherOutputStream(decfos,decipher); 

      while((read = cis.read())!=-1) 
        { 
         fos.write((char)read); 
         fos.flush(); 
        } 
      fos.close(); 
      while((read=encfis.read())!=-1) 
      { 
       cos.write(read); 
       cos.flush(); 
      } 
      cos.close(); 

    }catch (Exception e) { 
     // TODO: handle exceptione 
     e.printStackTrace(); 
    } 
    return 100; 
} 

}

답변

1

당신은 일반 텍스트의 크기를 알고, 단순히 CountingOutputStream에 하나를 포장. CipherInputStream에 대해서도 동일하게 수행 할 수 있지만 물론 CountingInputStream으로 처리 할 수 ​​있습니다. 이 경우 CountingInputStreamCipherInputStream에 넣는 것이 좋습니다. 일반 텍스트가 아닌 미리 암호문 크기를 알고 있기 때문입니다. 일반 텍스트와 암호 텍스트의 크기가 거의 같아야하므로 사용자는 별다른 차이를 보지 않아야합니다. 두 클래스 모두 Apache commons I/O 라이브러리에서 찾을 수 있습니다.

미리 평문/암호문의 크기를 알고 있다면 도움이 될 것입니다.하지만 그 자체가 말하는 것 같습니다. 파일의 크기는 through the standard java.nio libraries 또는 the older Java 6 new I/O API입니다. 마지막으로 스트림에 쓰기 전에 모든 바이트를 메모리에 먼저 스트림하지 않아야합니다. 4KiB 블록 크기 (가능한 경우 ByteBuffer 사용).

+0

감사합니다. AysncTask를 사용해 보겠습니다. – user1778855