【发布时间】: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