1

Я тестирую неполные URL-адреса в AsyncTask, чтобы обрабатывать недостающее изображение и использовать по умолчанию для моего изображения. Я заметил, что stacktrace печатается несколько раз. Я беспокоюсь, что это также создает это растровое изображение снова и снова. Это нормально? Какие-нибудь предложения по работе с этим лучше?HttpURLConnection catch block repeating

Код:

@Override 
protected Bitmap doInBackground(String... params) { 
    Bitmap artistImg = null; 
    HttpURLConnection urlConnection = null; 

    try { 
     URL url = new URL(params[0]); 
     urlConnection = (HttpURLConnection) url.openConnection(); 
     urlConnection.setRequestMethod("GET"); 
     urlConnection.connect(); 

     InputStream is = urlConnection.getInputStream(); 
     artistImg = BitmapFactory.decodeStream(is); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
     artistImg = BitmapFactory.decodeResource(
       context.getResources(), R.drawable.question); 

    } catch (Exception e) { 
     Log.v(LOG_TAG, "NETWORK ERROR"); 
    } finally { 
     if (urlConnection != null) urlConnection.disconnect(); 
    } 

    return artistImg; 
} 

StackTrace (повтор 15+ раз):

06-24 10:09:49.354 21523-21567/com.zosocoder.android.spotifystreamer W/System.err﹕ java.io.FileNotFoundException: https://i.scdn.co/image/792a417e8500405 
06-24 10:09:49.354 21523-21567/com.zosocoder.android.spotifystreamer W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:206) 
06-24 10:09:49.355 21523-21567/com.zosocoder.android.spotifystreamer W/System.err﹕ at com.android.okhttp.internal.http.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:210) 
06-24 10:09:49.355 21523-21567/com.zosocoder.android.spotifystreamer W/System.err﹕ at com.android.okhttp.internal.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:25) 
06-24 10:09:49.355 21523-21567/com.zosocoder.android.spotifystreamer W/System.err﹕ at com.zosocoder.android.spotifystreamer.ArtistAdapter$FetchArtistThumbTask.doInBackground(ArtistAdapter.java:85) 
06-24 10:09:49.355 21523-21567/com.zosocoder.android.spotifystreamer W/System.err﹕ at com.zosocoder.android.spotifystreamer.ArtistAdapter$FetchArtistThumbTask.doInBackground(ArtistAdapter.java:68) 
06-24 10:09:49.355 21523-21567/com.zosocoder.android.spotifystreamer W/System.err﹕ at android.os.AsyncTask$2.call(AsyncTask.java:292) 
06-24 10:09:49.355 21523-21567/com.zosocoder.android.spotifystreamer W/System.err﹕ at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
06-24 10:09:49.356 21523-21567/com.zosocoder.android.spotifystreamer W/System.err﹕ at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
06-24 10:09:49.356 21523-21567/com.zosocoder.android.spotifystreamer W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
06-24 10:09:49.356 21523-21567/com.zosocoder.android.spotifystreamer W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
06-24 10:09:49.356 21523-21567/com.zosocoder.android.spotifystreamer W/System.err﹕ at java.lang.Thread.run(Thread.java:818) 
+0

ты создание экземпляра AsyncTask несколько раз, например загружать изображения в ListView? – CSmith

+0

@CSmith Да, он тянет изображение для каждого элемента списка. Прямо сейчас у меня есть только 3 элемента, один из которых имеет плохой URL. – ZosoCoder

+0

Ваш адаптер списка getView() вызывается несколько раз для этой строки, в результате чего вы ставите в очередь 15 вызовов этого AsyncTask – CSmith

ответ

1

Вы могли бы рассмотреть возможность использования либо Picasso или Glide для загрузки изображений. Это упростит загрузку изображения. Обе эти библиотеки обрабатывают загрузку изображений в фоновом режиме/кэширование уже загруженных изображений на диск/указание изображений по умолчанию в случае сбоя вашего запроса при получении изображения.

Загрузка изображения будет просто:

Glide.with(context) 
    .load("http://goo.gl/gEgYUd") 
    .placeholder(R.drawable.loading_spinner) 
    .into(imageView); 

Я лично предпочитаю Glide, поскольку я считаю, что это будет быстрее, но обе эти библиотеки работают хорошо, и пощадит вас от обработки ваших растровых изображений вручную.

+0

Спасибо за предложение! Я обязательно проверю это. Я работаю по udacity и Lynda для Android, и это выглядит намного проще в использовании, чем то, что я узнал до сих пор. – ZosoCoder

0

Android-запросы

Android-запрос (AQuery) представляет собой легкая библиотеку для выполнения асинхронных задач и управления элементами пользовательского интерфейса в Android. вы можете получить aquery здесь

https://code.google.com/p/android-query/downloads/detail?name=android-query-full.0.24.3.jar

И documentaton от

https://code.google.com/p/android-query/wiki/ImageLoading

Вы можете загружать изображения из URL в ваш ImageView следующим простым кодом

AQuery aq = new AQuery(getApplicationContext()); 
ImageView image=(ImageView)findViewById(R.id.imageview); 
aq.id(image).image("http://www.vikispot.com/z/images/vikispot/android-w.png"); 
+0

Спасибо за предложение! Я проверю это. Гораздо чище, чем то, что я делал. – ZosoCoder