Я пытаюсь сделать некоторые шифровки и показать диалог прогресса, пока они запущены, потому что в зависимости от количества шифровок это может занять минуты или даже часы. Я пытаюсь измерить батарею до и после, чтобы увидеть, сколько батареи разрядится определенное количество раундов. Моя проблема в том, что основной поток не ждет, пока 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();
}
}
}
Вы хотите использовать метод onPostExecute (response) asynctask, который дает вам ответ и использует этот ответ там. Вы можете использовать метод, чтобы получить ответ, или если вам нужен этот ответ в какой-либо другой деятельности/классе, вы можете использовать интерфейс. – HaroldSer