我正在测试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)
答案 0 :(得分:1)
您可以考虑使用Picasso或Glide来加载图片。它会使您的图像加载更简单。这两个库都处理在后台加载图像/缓存已加载的磁盘上的图像/指定默认图像,以防请求在检索图像时失败。
加载图片只需:
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");