2013-10-24 5 views
1

в моем приложении Я загружаю изображения, получаемые с URL-адреса. Проблема здесь в том, что она занимает слишком много времени. Изображения сжаты и всего 9 км. Я загружаю 50 из них, так что скажем, 500kByte изображений загружаются приложением. Это должно быть довольно быстро, не так ли? Ну, это не так. Я иногда теряю 20 секунд, пока не загрузится. Что там так долго? У меня довольно простой способ загрузки изображений. ЗдесьУскорьте время загрузки изображения

int downloadingImages = getDownloadImageCount(); 
     System.out.println(downloadingImages); 
     if(downloadingImages == 0){ 
      for(int c = downloadingImages; c < 50; c++){ 
       try{      

         bitmapArr[c]  = getBitmapFromURL(imageURLArr[c]); 
         setDownloadImageCount(50); 
         publishProgress(c); 
        } catch (FileNotFoundException f1){ 
         Log.v("FileNotFoundException", "Bitmap konnte nicht geladen werden"); 
       } catch(NullPointerException e){ 

       } catch (IllegalStateException ie){ 

       } 
       setDownloadImageCount(50); 
      } 
     } 

Это функция getBitmapFromUrl

public static Bitmap getBitmapFromURL(String src) throws FileNotFoundException { 
    try { 
     //Downloading the image 
     URL url = new URL(src); 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
     connection.setDoInput(true); 
     connection.connect(); 
     try{ 
      //Saving the image to a bitmap and return it 
      InputStream input = connection.getInputStream(); 
      Bitmap myBitmap = BitmapFactory.decodeStream(input); 
      return myBitmap; 
      //Catch Exception if file not found 
     } catch(FileNotFoundException ffe){ 
      Log.v("FileNotFoundException", "getBitmapFromURLMethod"); 
      return null; 
     }   
     //Catch Exception if error at input and output 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 

Я имею в виду, что это так долго там? Как увеличить скорость. Я буду использовать cahing для изображений позже, но все же ... Я имею в виду, что это 500 килобайт и занимает так много времени. Почему это?

+0

не пытайтесь изобретать велосипед: http://square.github.io/picasso/ – Budius

+1

Поместите временную метку как длинную на несколько строк. Это может рассказать вам, что происходит слишком долго. Соединение с сервером также требует много времени. Поэтому убедитесь, что установление соединения занимает время или загрузка. –

+0

Вы также можете использовать универсальный загрузчик изображений: https://github.com/nostra13/Android-Universal-Image-Loader –

ответ

2

Его вполне естественно, что требуется некоторое время. Для каждый загруженный с URL-адреса загружается новый HTTP-запрос (который отправляется на сервер, и он отвечает).

Это 50 раз больше времени кругосветного путешествия по сети (даже если время, на которое сервер может ответить). Вы должны кэшировать изображения локально после их восстановления.

0

Try обернуть InputStream в BufferedInputStream

BufferedInputStream bs = new BufferedInputStream(input); 
Bitmap myBitmap = BitmapFactory.decodeStream(input); 
2

Самый длинный шаг в этом процессе, вероятно, отправив запрос на сервер и ждет его, чтобы ответить, и вы повторять этот шаг в 50 раз. У вас есть возможность модифицировать сервер? Если да, рассмотрите возможность добавления действия, которое позволяет загружать сразу все 50 изображений (возможно, помещая их в zip-файл, а затем распаковывая их на стороне клиента).

+0

Любая идея, как это делается? Я не слышал об этом раньше, было бы прекрасно учиться. – Chud37

+0

Это очень высокоуровневое описание решения. Если вы загружаете изображения в клиентское приложение, у вас, вероятно, есть сервер-клиентская архитектура с MVC или подобной архитектурой на стороне сервера (Ruby on Rails, Asp.NET и т. Д.). Вы должны создать новое действие на сервере, использовать стороннюю библиотеку, чтобы поместить изображения в zip-файл, отправить zip-файл в качестве результата действия, а затем использовать стороннюю библиотеку на вашем клиенте для распаковки изображений. – Kevin

Смежные вопросы