Как остановить Executor?
Когда я закрываю activity не дожидаясь загрузки метода run метод остаётся в очереди пока не сработает. Как бы сделать чтобы при onDestroy к примеру он обрубался или удалял всю очередь. .
final Context ctx = this;
final DownloadFile.Listener listener = this;
// Создаем исполнитель, который выполняет задачи в основном потоке.
Executor mainExecutor = ContextCompat.getMainExecutor(this);
// Выполнение задачи в основном потоке
mainExecutor.execute(new Runnable() {
@Override
public void run() {
// Здесь находится логика вашего кода.
remotePDFViewPager = new RemotePDFViewPager(ctx, loadUrl, listener);
remotePDFViewPager.setId(R.id.pdfViewPager);
}
});
}
Ответы (1 шт):
Один из простейших приёмов, который используется для обхода выполнения содержимого метода run() потока - установка флага, сигнализирующего о некоем внешнем событии, в результате которого потоку нет необходимости исполнять свой код. Примерная концепция кода выглядит следующим образом:
class MyActivity extends Activity {
private MyRunnable runnable;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Executor mainExecutor = ContextCompat.getMainExecutor(this);
this.runnable = new MyRunnable();
mainExecutor.execute(this.runnable);
}
@Override
public void onDestroy() {
super.onDestroy();
this.runnable.terminate();
}
}
class MyRunnable implements Runnable {
private volatile boolean isTerminated;
@Override
public void run() {
if (!isTerminated) {
// Здесь находится логика вашего кода.
}
}
public void terminate() {
isTerminated = true;
}
}
Однако не всё так просто. В момент установки флага извне, метод run() уже может выполняться и соответственно изменение значения флага никак не отобразится на логике выполнения кода. Т.е. в зависимости от вашей бизнес логики и целостности операций, надо (или не надо) будет производить соответствующие проверки внутри метода run().