загрузить много изображений с сервера в андроид

Мне нужно загрузить несколько растровых изображений с сервера в Android. Я хочу использовать AsyncTask, выполненный с использованием .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR). Но мой исполнитель перегружен. Так что я думаю, если я поставлю задержку, это должно помочь. Итак, мой вопрос: как мне поставить задержку на исполнителя? Я думаю об использовании handler.postDelay, но он принимает только runnables. Есть ли способ заставить его работать с исполнителем?

Хорошим решением может быть запуск 20 вызовов за раз, а затем ожидание 100 миллисекунд для запуска следующих 20. Кто-нибудь знает способ сделать это на Android?

@Пит

Я использую один поток на вызов. Я не был уверен, что несколько вызовов в одном потоке вызовут проблему.

@Override
protected Bitmap doInBackground(Void... params) {
   try {

      HttpURLConnection conn = (HttpURLConnection) url.openConnection();
      conn.setDoInput(true);
      conn.connect();
      InputStream is = conn.getInputStream();
      return BitmapFactory.decodeStream(is);
   } catch (IOException e) {
      e.printStackTrace();
      return null;
   }
}

person Cote Mounyo    schedule 23.10.2013    source источник
comment
Что вы делаете с растровыми изображениями, которые вы создаете из полученных изображений? Скорее всего, вам не хватит памяти, если вы не записываете их в файл, а затем вызываете Bitmap.recycle().   -  person Rick Falck    schedule 24.10.2013
comment
Рассматривали ли вы возможность использования IntentService для каждого изображения? Если нет, посмотрите мой ответ на: stackoverflow.com/questions/19291462/   -  person cYrixmorten    schedule 24.10.2013


Ответы (2)


+1 к идее cYrixmorten об использовании IntentService. По моему опыту, это намного надежнее, чем использование AsyncTask, особенно при загрузке большого объема информации.

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

Надеюсь это поможет!

person physphil    schedule 23.10.2013

Если вы просто хотите добавить паузу, используйте в doInBackground следующее:

count = 1;
// use your loop of choice
for(int i = 0; i < n; i++) {
            // Do your stuff here...
    if(count % 20) { // Sleep every 20 iterations
        Thread.sleep(100);
    }
    count++;
}

Однако, как заявил @petey, код был бы лучшим подспорьем. В зависимости от того, что вы делаете, может быть лучшая альтернатива использованию AsyncTask (возможно, IntentService).

person Jason    schedule 23.10.2013
comment
Как и спросил Рик, что вы делаете с растровыми изображениями? Если они переходят в какой-то ListView/GridView, то Universal Image Loader может быть лучшим решением. Как и @physphil, я использовал его, и он отлично работает. - person Jason; 24.10.2013