HttpURLConnection catch 块重复

HttpURLConnection catch block repeating

我正在 AsyncTask 中测试不完整的 URL 以处理丢失的图像并为我的图像视图使用默认的可绘制对象。我注意到堆栈跟踪被打印了好几次。我担心这也会一遍又一遍地创建该位图。这是正常的吗?有什么更好地处理这个问题的建议吗?

代码:

@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;
}

堆栈跟踪(重复 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.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.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)

您可以考虑使用 Picasso or Glide 来加载您的图片。这将使您的图像加载更加简单。这两个库都处理在 background/caching 中加载图像 已经在 disk/specifying 默认图像上加载图像,以防您的请求在检索图像时失败。

加载一张图片就是:

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

我个人更喜欢 Glide,因为我发现它更快,但是这两个库都运行良好,并且可以免除您手动处理位图的麻烦。

Android 查询

Android-Query(AQuery)是一个轻量级库,用于执行异步任务和操作Android中的UI个元素。 你可以从这里查询

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

以及来自

的文档

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");