2016-03-05 51 views
1

我使用的AsyncTask(首次),而文件被加密,以显示进度条。在我尝试添加进度条之前,我的加密工作正常,但似乎现在已经崩溃了应用程序。我知道onPreExecute()从测试中起作用,所以我认为问题在于doInBackground()。任何帮助将非常感激。的AsyncTask进度条

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

这可以通过点击此按钮

public void EncryptButton(View view) { 

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

} 
+0

请始终提供崩溃日志如果你想与崩溃 –

+0

帮助提供的崩溃日志。作为一个起点,在验证数据并确保所有字段都有效之前,不要启动异步任务。 – Francesc

+0

您通常不应该对后台任务执行UI操作。尝试从'doInBackground'中删除对“吐司”的呼叫 –

回答

1

你得到最有可能是这样的NetworkOnMainThreadException异常调用。

在AsyncTask中,您不允许对doInBackground方法中的视图进行任何修改。这应该全部移到onPreExecute,onPostExecute或onUpdate。

至少这条线是违反指出:

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

删除吐司修复了它。非常感谢! –