Я выполняю удаленные операции воспроизведения выбирающего звуковой файл и звукового файла в использовании фонового потока AsyncTask
. A Cancellable
индикатор выполнения показывают в течение времени операционные выполнения выборки.
Я хочу отменить/прервать AsyncTask
выполненный то, когда пользователь отменяет (отклоняет) операцию. Что идеальный путь состоит в том, чтобы обработать такой случай?
Только что обнаружил, что AlertDialogs
boolean cancel (...);
Я везде использовал, на самом деле ничего не делает. Большой.
Итак ...
public class MyTask extends AsyncTask<Void, Void, Void> {
private volatile boolean running = true;
private final ProgressDialog progressDialog;
public MyTask(Context ctx) {
progressDialog = gimmeOne(ctx);
progressDialog.setCancelable(true);
progressDialog.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
// actually could set running = false; right here, but I'll
// stick to contract.
cancel(true);
}
});
}
@Override
protected void onPreExecute() {
progressDialog.show();
}
@Override
protected void onCancelled() {
running = false;
}
@Override
protected Void doInBackground(Void... params) {
while (running) {
// does the hard work
}
return null;
}
// ...
}
Простой: не используйте AsyncTask
. AsyncTask
предназначен для коротких операций, которые заканчиваются быстро (десятки секунд) и, следовательно, не требуют отмены. «Воспроизведение аудиофайлов» не подходит. Вам даже не нужен фоновый поток для обычного воспроизведения аудиофайлов.
Единственный способ сделать это - проверить значение метода isCancelled() и остановить воспроизведение, когда он возвращает true.