简体   繁体   English

AsyncTask进度栏

[英]AsyncTask progress bar

I am using AsyncTask (for the first time) to display a progress bar while a file is being encrypted. 我正在使用AsyncTask(第一次)在加密文件时显示进度条。 My encryption worked before I tried adding the progress bar but seems to crash the app now. 在尝试添加进度条之前,我的加密已起作用,但现在似乎使该应用程序崩溃。 I know the onPreExecute() works from testing so I think the problem lies in doInBackground(). 我知道onPreExecute()可通过测试运行,所以我认为问题出在doInBackground()。 Any help would be really appreciated. 任何帮助将非常感激。

public class EncryptAsync extends AsyncTask<Void, Void, Void> {
    //ProgressDialog progressDialog;

    //declare other objects as per your need
    @Override
    protected void onPreExecute() {
        //   progressDialog = ProgressDialog.show(EncryptFile.this, "Progress Dialog Title Text", "Process Description Text", true);


        if (password.getText().toString().equals(confirmPassword.getText().toString())) {

            correctPassword = password.getText().toString();
            //Toast.makeText(this,correctPassword,Toast.LENGTH_LONG).show();

            //copies Plain Text to String
            fileEditText.setInputType(InputType.TYPE_CLASS_TEXT);
            returnFile = fileEditText.getText().toString();
            Toast.makeText(EncryptFile.this, returnFile, Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(EncryptFile.this, "Passwords do not match", Toast.LENGTH_LONG).show();

        }

    }



    @Override
    protected Void doInBackground(Void... params) {


        if (spinnerValue.equals("AES")) {
            Toast.makeText(EncryptFile.this, returnFile, Toast.LENGTH_LONG).show();

            try {
                // Here you read the cleartext.
                FileInputStream fis = new FileInputStream(returnFile);
                // This stream write the encrypted text. This stream will be wrapped by another stream.
                FileOutputStream fos = new FileOutputStream(returnFile + ".aes");

                // hash password with SHA-256 and crop the output to 128-bit for key
                MessageDigest digest = MessageDigest.getInstance("SHA-256");
                digest.update(correctPassword.getBytes());

                // copys hashed password to key
                System.arraycopy(digest.digest(), 0, key, 0, key.length);


                SecretKeySpec sks = new SecretKeySpec(key, "AES");
                // Create cipher
                Cipher cipher = Cipher.getInstance("AES");
                cipher.init(Cipher.ENCRYPT_MODE, sks);
                // Wrap the output stream
                CipherOutputStream cos = new CipherOutputStream(fos, cipher);
                // Write bytes
                int b;
                byte[] d = new byte[8];
                while ((b = fis.read(d)) != -1) {
                    cos.write(d, 0, b);
                }
                // Flush and close streams.
                cos.flush();
                cos.close();
                fis.close();
            } catch (Exception ex) {
                Toast.makeText(EncryptFile.this, "Error with Exception", Toast.LENGTH_LONG).show();
            } catch(Throwable t){
                Toast.makeText(EncryptFile.this, "Error with throwable", Toast.LENGTH_LONG).show();
            }

        } else if (spinnerValue.equals("Blowfish")) {
//code for blowfish
        }



         return null;
    }
@Override
    protected void onPostExecute(Void result) {
        Toast.makeText(EncryptFile.this, "Finished Encryption", Toast.LENGTH_LONG).show();
        // super.onPostExecute(result);
        // progressDialog.dismiss();
    }

This is called by clicking this button 通过单击此按钮来调用

public void EncryptButton(View view) {

    EncryptAsync task = new EncryptAsync();
    task.execute();

}

The exception you're getting will most likely be something like NetworkOnMainThreadException. 您得到的异常很可能是NetworkOnMainThreadException之类的东西。

In an AsyncTask, you are not allowed to do any modifications to the view in the doInBackground method. 在AsyncTask中,不允许在doInBackground方法中对视图进行任何修改。 This should all be moved to either the onPreExecute, onPostExecute or onUpdate. 所有这些都应移至onPreExecute,onPostExecute或onUpdate。

At least this line is in violation of that: 至少这行违反了这一点:

Toast.makeText(EncryptFile.this, returnFile, Toast.LENGTH_LONG).show();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM