0

Я запускаю загрузку файла 2Gb с помощью DownloadManager, и при этом я предлагаю пользователю выбрать, где они хотят сохранить это файл: внутреннее хранилище или SD-карта. Кроме того, я предоставляю пользователю возможность отменить указанную загрузку. Вот мой код:DownloadManager занимает 3-5 минут, чтобы остановить загрузку, только когда используется SD-карта

DownloadManager.Query query = new DownloadManager.Query(); 
query.setFilterById(downloadId); 
Cursor cursor = downloadManager.query(query); 

try { 
    if (cursor.moveToFirst()) { 
     int status =cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)); 
     if (status == DownloadManager.STATUS_RUNNING || 
       status == DownloadManager.STATUS_PENDING) { 
      downloadManager.remove(downloadId); 
     } 
    } 
} finally { 
    cursor.close(); 
} 

Моя проблема: при загрузке во внутреннюю память, то .remove (downloadId) вызов работает мгновенно, а загрузка прекращается. Но при загрузке на SD-карту (на Samsung Galaxy S7 Edge), используя тот же код, для остановки загрузки требуется 3-5 минут.

Любые идеи по устранению этой задержки?

Редактировать: некоторые примеры дорожки, возвращаемые Activity.getExternalFilesDirs():

/storage/emulated/.../ - это внутренний

/хранение/0123-4567/.../- это SD карта

+0

Можете ли вы привести примеры путей, которые вы считаете встроенными и на SD-карте? – greenapps

+0

только что отредактировал вопрос, чтобы добавить пути – zrgiu

+0

/storage/emulated/0/...... называется внешним хранилищем. Получено с помощью getExternalStorageDirectory(). Но я не вижу решения. Прости. Вы тестировали другие устройства? – greenapps

ответ

0

Найден ответ для себя: это выглядит как перед началом загрузки, то DownloadManager создает файл 2Gb (размер файла я загружаю), заполненный нули так что он сохраняет выделенное хранилище. Эта операция записи файлов - это то, что делает это медленным на SD-карте.

Внутренняя память на S7 Edge сумасшедшая, поэтому проблемы там нет. Фактическая проблема (ошибка ОС, на мой взгляд) заключается в том, что вызов .remove() ждет этой начальной операции записи вместо ее отмены.