0

Я пытаюсь сделать некоторые шифровки и показать диалог прогресса, пока они запущены, потому что в зависимости от количества шифровок это может занять минуты или даже часы. Я пытаюсь измерить батарею до и после, чтобы увидеть, сколько батареи разрядится определенное количество раундов. Моя проблема в том, что основной поток не ждет, пока AsyncTask завершит шифрование.Основная тема для Android не ждет AsyncTask

Вот то, что я до сих пор:

private void performEncryption(String name) throws InterruptedException { 
     int times = this.getNumTimes(); 

     float batteryPercentageBefore = (new Battery(this)).percentage(); 
     Log.d("BATTERY", String.valueOf(batteryPercentageBefore)); 

     long timeBefore = System.currentTimeMillis(); 

     EncryptionHandler algo = new EncryptionHandler(name); 

     (new EncryptionWorker()).execute(new EncryptorParams(algo, times)); 

     float batteryPercentageAfter = (new Battery(this)).percentage(); 
     Log.d("BATTERY", String.valueOf(batteryPercentageAfter)); 

     long timeAfter = System.currentTimeMillis(); 

     float batteryUsed = batteryPercentageBefore - batteryPercentageAfter; 
     Log.d("BATTERY", "Change: " + String.valueOf(batteryUsed)); 
     long totalTime = timeAfter - timeBefore; 

     String text = "It took " + Double.toString(totalTime/1000.0) + " seconds to run " + name 
       + " algorithm " + Integer.toString(times) + " times, and it used " + Float.toString(batteryUsed) + "% of battery."; 
     Toast.makeText(getApplicationContext(), text, 
       Toast.LENGTH_LONG).show(); 
     lblEncryption.setText(text); 
    } 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_encryption, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    private class EncryptionWorker extends AsyncTask<EncryptorParams, Integer, Integer> { 
     private ProgressDialog dialog; 

     @Override 
     public void onPreExecute() { 
      super.onPreExecute(); 

      this.dialog = new ProgressDialog(EncryptionActivity.this); 
      this.dialog.setTitle("Encrypting"); 
      this.dialog.setMessage("Please wait. This may take a while"); 

      this.dialog.show(); 
     } 

     @Override 
     public Integer doInBackground(EncryptorParams... params) { 
      for (int i = 0; i < params[0].rounds; i++) { 
       try { 
        params[0].encryptor.encrypt("Performs the encryption algorithm", "the name of the encryption algorithm, can be: AES, 3DES, Blowfish"); 
       } catch (Exception e) { 
        Log.e("EXCEPTION", e.getMessage()); 
        return 1; 
       } 
      } 

      return 0; 
     } 

     @Override 
     protected void onPostExecute(Integer result) { 
      super.onPostExecute(result); 

      this.dialog.dismiss(); 
     } 
    } 
} 
+0

Вы хотите использовать метод onPostExecute (response) asynctask, который дает вам ответ и использует этот ответ там. Вы можете использовать метод, чтобы получить ответ, или если вам нужен этот ответ в какой-либо другой деятельности/классе, вы можете использовать интерфейс. – HaroldSer

ответ

4

Моя проблема заключается в том, что основной поток не дожидаясь AsyncTask закончить шифровки

То есть точка позади с фоновой нитью в первую очередь.

Что бы вы ни делали, когда AsyncTask закончил свою работу, поставьте onPostExecute().

+0

Ты совершенно прав. Я пытался сделать это с помощью потоков и присоединиться() раньше, и именно поэтому у меня это было так. Исправлено перемещение всего на функцию onPostExecute(). – Hugo