2016-09-14 4 views
3

Я прочитал много вопросов и ответов в StackOverflow о прерывании потоков, бросая InterruptedException.Как прервать эту операцию

Но большинство ответов использует только цикл for, и время от времени они проверяют, прерван ли поток: Thread.currentThread().isInterrupted().

Мой код, как:

public class UploadVideoRunnable implements Runnable { 

     @Override 
     public void run() { 
      isUploaded = new uploadMedia(title, uri); 
     } 
    } 

Как/Где я должен добавить код для проверки, если поток прерывается?

Извините, если это вопрос о нобе, но я искал google много и не нашел ответа.

Благодаря

EDIT: обновленный код, uploadMedia класс и не метод

+2

В 'uploadMedia'. Для прерывания проверки нет волшебства, это обычный код: вы не можете проверить прерывание в середине кода, не помещая проверку в середине кода. –

+2

Runnable! = Thread – Blackbelt

+0

@Blackbelt Я использовал этот ответ [здесь] (http://stackoverflow.com/a/9458785/4856442), и он рекомендует передавать runnable, а затем вызывать отмену. И я использовал этот ответ [здесь], чтобы узнать, как отменить runnable. Я понимаю, что вы говорите, но я не вижу, как это влияет на мое дело. – Mes

ответ

2

"перебивает" требует "сотрудничества" здесь.

Это означает, что вы можете прервать только звонки ..., которые содержат такого рода конструкции петли:

while (notDone) { doSomething(); Thread.sleep(); } 

или что-то, так. Это означает: вам нужно будет изучить этот метод uploadMedia() и посмотреть, разрешает ли это такие изменения. Таким образом, вы бы изменить, что:

while (notDone) { 
    if(interrupted) { 
    notDone = false; 
    } else { 
    doSomething(); 
    Thread.sleep(); 
    } 
} 

Конечно, выше быть больше как «псевдо-код»; вы должны заполнить детали.

В качестве альтернативы вы можете ознакомиться с ExecutorServices; как есть некоторые средства для насильно остановить те; см. here

EDIT: это не должно меняться. Вы видите - вы вызываете метод там; конструктор этого класса. И точно, этот конструктор будет звонить другие методы; и один из тех других методов - это тот, который работает в течение более длительного периода времени, чтобы выполнить свою загрузку.

Наконец: обратите внимание, что прервала может быть также что-то вроде

if (externalThingy.hasBeenCancelled()) { 

Значение: вы, возможно, придется добавить другой параметр к классу; то, что класс Uploader может запросить каким-то образом, чтобы понять, следует ли прекратить делать то, что он делает сейчас!

+0

Я понимаю, что вы имеете в виду и благодарит. Я отредактировал ответ, потому что я сделал ошибку. 'uploadMedia()' - это класс, а не метод. Что это значит? – Mes

+1

См. Мой обновленный ответ. – GhostCat

+0

', который не должен меняться, это то, что я хотел услышать. Спасибо за ответ. – Mes

1

В Android вы не можете прерывать/отменять поток выполнения извне (Bionic даже не реализует pthread_cancel()). То есть любой поток должен решить сам по себе, если он должен завершиться (через возврат от run()) или продолжить выполнение. Единственный способ уведомить какой-либо поток, который он должен как можно скорее прекратить, - использовать партию interrupt()/isInterrupted(). Поток, который должен быть прерван, должен периодически проверять, прервал ли кто-то его или нет. Итак, вы должны разделить свою работу на небольшие куски и проверить между ними. Если у вас нет возможности разбить его - вам нечего делать, а только ждать, пока эта работа не будет завершена.

+0

Есть ли у вас документация, которая говорит мне, что возврат из 'run()' означает, что он завершает процесс? –

+0

@MeikVtune Возврат из потока 'run()' потока не завершает весь процесс, а только тот поток. – Sergio

+0

Извините, это было то, что я пытался сказать. –

Смежные вопросы