Как остановить Executor?

Рейтинг: 0Ответов: 1Опубликовано: 27.04.2023

Когда я закрываю 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().