1

我想ProgressBar在文件加密时运行。

我有以下代码,但我如何知道或分解大小,以便完成后达到 100%?如在加密工作时更新进度条 %。

我是Android新手,所以我还有很多东西我还不知道,还没有理解。

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

}

4

2 回答 2

1

您知道纯文本的大小,因此如果您正在写入CipherOutputStream,只需用CountingOutputStream. 您可以对 执行相同的操作CipherInputStream,但CountingInputStream当然可以使用 a。在这种情况下,您最好将其放入其中CountingInputStreamCipherInputStream因为您可能事先知道密文大小,而不是纯文本。不过您可能并不在意,因为纯文本和密文的大小应该几乎相同——用户应该不会看到太大的差异。这两个类都可以在 Apache 公共 I/O 库中找到。

如果您事先知道明文/密文的大小当然会有所帮助,但我想这不言自明。文件的大小可以通过标准java.nio较旧的 Java 6 新 I/O API找到。最后,您显然不应该在将所有字节写入流之前先将所有字节流式传输到内存,而是使用例如 4KiB 块大小(ByteBuffer如果可能,使用)。

于 2013-03-19T20:14:46.297 回答
1

看看 AsyncTask http://developer.android.com/reference/android/os/AsyncTask.html 它会做你想要的——比尝试使用原始线程容易得多。

于 2013-03-19T20:17:40.470 回答