Начать и прервать и снова запустить поток - PullRequest
0 голосов
/ 14 мая 2019

я запустил тему, когда активность создана в android

при нажатии кнопки остановит поток, чтобы увидеть мои данные в определенное время, после этого я запускаю поток, нажимая кнопку запуска это снова запустит поток

иногда это работает правильно, иногда я получаю прерванную ошибку,

strt.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
             Drawer.start();
   });
    stp.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
        Drawer.interrupt();  });

что делать?

1 Ответ

1 голос
/ 14 мая 2019

Предполагая, что Drawer является потоком, вы не можете запустить его дважды: "Никогда не разрешается запускать поток более одного раза" . Ваши основные предположения о том, как написать этот код, ошибочны.

Я бы предложил не использовать темы напрямую. Вместо. Используйте ExecutorService, например:

ExecutorService executor = Executors.newFixedThreadPool(1);

Затем отправьте работу в этот пул в onClickListener вашей кнопки запуска:

future = executor.submit(runnable);

где runnable - это работа, которую вы хотите сделать.

Возвращенный Future - это вещь, которая передает результат выполнения runnable, но также позволяет вам делать такие вещи, как отмена (т. Е. Попросить прекратить выполнение):

future.cancel(true);

где true означает, что вы хотите прервать основной поток, который его выполняет.

Следовательно, сохраняйте future в переменной-члене при нажатии кнопки запуска, а затем отменяйте ее, как указано выше, при нажатии кнопки остановки.

Обратите внимание, что вам нужно сделать прерывание работоспособной ручки: это не то, что происходит "бесплатно". Прерывание - это кооперативный механизм: код может свободно реагировать на прерывание (или нет).

...