HttpURLConnection catch块重复

时间:2015-06-24 17:25:05

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

我正在测试AsyncTask中不完整的URL来处理丢失的图像,并使用默认的drawable作为我的imageview。我注意到堆栈跟踪被打印了好几次。我担心这也是一遍又一遍地创建那个位图。这是正常的吗?有没有更好的处理方法?

代码:

@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)

2 个答案:

答案 0 :(得分:1)

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

加载图片只需:

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

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

答案 1 :(得分:0)

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

您可以通过以下简单代码将图片从网址加载到您的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");