Загрузка большого списка файлов в фоновом режиме на Android

#android

#Android

Вопрос:

У меня есть приложение, которое позволяет пользователю кэшировать данные для автономного использования. Данные, которые мне нужно загрузить, в основном представляют собой изображения, но включают и другие вещи, такие как видео, текстовые файлы и mp3. Для загрузки может быть всего 20 файлов или более 300. Размер файлов варьируется от нескольких килобайт до нескольких мегабайт в случае видео.

Я пробовал использовать сервис с циклом и сервис с обычным старым потоком, но даже если я использую startForeground в сервисе, он неизбежно прерывается из-за «тайм-аута выполнения сервиса» и ANR примерно после 10 файлов или около того как на моем Droid, так и на моем Incredible.

Когда я получаю ANR, кажется, что пользовательская система использует процессор примерно на 45-50%. Служба перезапускается через некоторое время и продолжается, но мне нужно, чтобы загрузки имели приоритет в большинстве случаев.

Вот код для фактической загрузки файла, который выполняется в потоке:

 try {
    URL request = new URL(entry.remotePath);
    InputStream is = (InputStream) request.getContent();
    FileOutputStream fos = new FileOutputStream(entry.localPath);
    try {
        byte[] buffer = new byte[4096];
        int l;
        while ((l = is.read(buffer)) != -1) {
            fos.write(buffer, 0, l);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        is.close();
        fos.flush();
        fos.close();
    }
} catch (MalformedURLException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}
  

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

Я ориентируюсь на систему 8 и выше, если это имеет значение.

Ответ №1:

Проверьте AsyncTask. Это позволит вам создавать фоновый режим для ваших длительно выполняющихся процессов при отображении пользовательского интерфейса.

Кроме того, вы можете найти хорошее / официальное руководство по потоковой обработке Android здесь.

Комментарии:

1. На самом деле я понял это сразу после того, как опубликовал вопрос. Разделив некоторые отдельные задачи, такие как загрузка файла в их собственный вложенный поток, я, кажется, остановил систему от уничтожения моего сервиса.