Вы должны взглянуть на реализацию HTTP-диапазонов. Это позволит вам перезапустить загрузку при сбое.
Относительно того, почему это прекращается, некоторые операторы устанавливают ограничения на загрузку, которые разрывают соединение через определенное время или объем загрузки. Я видел это из первых рук на одном британском перевозчике, а мне рассказывали об этом на других. Обычно легко проверить ограничение, пытаясь загрузить файл через браузер Android, и если вы видите, что он останавливается или останавливается, вы знаете, что это, скорее всего, проблема с носителем (и да, загрузка может быть прервана без исключения).
Реализация Http Range позволит вам продолжить загрузку с того места, где она была остановлена, и, таким образом, ваш метод doInBackground будет использовать алгоритм задержки и возобновления, так что каждый раз, когда соединение прерывается, вы ждете некоторое время, а затем попробуйте возобновить с того момента, когда загрузка прекратилась (и, конечно, установить ограничение на повторные попытки, чтобы вы не получили бесконечный цикл, когда телефон действительно не может загрузить файл).