как можно отменить операцию загрузки/выгрузки файла, не завершая поток, выполняющий эту операцию?

Мой код вызывает метод API, который загружает файл из Интернета. Поскольку загрузка может занять много времени, я хотел бы предоставить пользователю возможность отменить загрузку, если он закроет окно, показывающее индикатор выполнения, в то время как фоновый поток обрабатывает загрузку файла.

Я не уверен, что у меня есть какой-либо контроль над кодом, вызываемым методом API, поэтому я предполагаю, что у меня нет возможности сообщить этому коду, что операцию загрузки необходимо отменить.

Если это предположение верно, как мне завершить операцию загрузки файла по запросу пользователя, не прерывая/не прерывая или иным образом не завершая фоновый поток, который выполняет фактическую загрузку файла?


person J Smith    schedule 12.07.2013    source источник
comment
если у вас есть доступ к сокету, просто закройте его, и он вызовет исключение для потока, иначе я предлагаю вам запустить его с помощью процесса, который содержит два потока (отменить прослушиватель и файл загрузки), который является файлом загрузки файла демон, для любого метода отмены просто сигнализируйте поток отмены, затем поток отмены просто завершает свою работу, что приводит к тому, что загрузка файла отключается молча, что-то вроде это   -  person    schedule 12.07.2013


Ответы (1)


Я ожидаю, что правильно разработанный метод загрузки файла будет прерываемым. Поэтому вам нужно прервать поток, в котором выполняется загрузка, что должно отменить загрузку (метод должен генерировать InterruptedException).

После того, как вы поймали исключение из потока загрузки, вы можете решить, что делать, например, дождаться отправки новой загрузки файла (т.е. не выйти).

person assylias    schedule 12.07.2013
comment
Я прав, предполагая, что методы загрузки файлов Apache Commons прерываемы? - person J Smith; 12.07.2013
comment
@JSmith Выбрасывают ли они InterruptedException? если они это сделают, то вы можете смело предположить, что они есть. И в любом случае это довольно легко проверить. Если это не так, вероятно, есть обходной путь (например, закрытие соединения из другого потока). - person assylias; 12.07.2013