【问题标题】:HttpURLConnection catch block repeatingHttpURLConnection 捕获块重复
【发布时间】:2015-06-24 17:25:05
【问题描述】:

我正在 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$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)

【问题讨论】:

  • 您是否多次实例化 AsyncTask,例如将图像加载到 ListView 中?
  • @CSmith 是的,它为每个列表项提取图像。现在我只有 3 项,其中一项的 URL 不正确。
  • 您的列表适配器 getView() 被该行多次调用,导致您对该 AsyncTask 的 15 次调用排队
  • @CSmith 谢谢,这为我指明了正确的方向。我的列表视图有 layout_height=wrap_content 。将此更改为 fill_parent 会导致对每个项目进行一次调用。

标签: java android try-catch httpurlconnection try-catch-finally


【解决方案1】:

您可以考虑使用PicassoGlide 来加载图像。这将使您的图像加载更加简单。这两个库都处理在后台加载图像/在磁盘上缓存已加载的图像/指定默认图像,以防您在检索图像时请求失败。

加载图像只是:

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

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

【讨论】:

  • 感谢您的建议!我一定会检查出来的。我正在学习适用于 Android 的 udacity 和 Lynda 课程,这看起来比我目前所学的要简单得多。
【解决方案2】:

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

【讨论】:

  • 感谢您的建议!我会检查一下。比我一直在做的要干净得多。
猜你喜欢
  • 2015-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-16
相关资源
最近更新 更多