Android 图片没有显示到 ImageView 来自图片 URL
Android image didn't display to ImageView from image URL
我想从“http://i.imgur.com/4GLKF4Q.jpg”向 ImageView 显示图像,但是图像 URL 中的图像没有显示图像视图。我可以这样做吗?
异步任务
class DownloadImageTask extends AsyncTask<String, Void, byte[]> {
ImageView bmImage;
public DownloadImageTask(ImageView bmImage) {
this.bmImage = bmImage;
}
protected byte[] doInBackground(String... urls) {
try {
URL url = new URL(urls[0]);
InputStream is = (InputStream) url.getContent();
byte[] buffer = new byte[8192];
int bytesRead;
ByteArrayOutputStream output = new ByteArrayOutputStream();
while ((bytesRead = is.read(buffer)) != -1) {
output.write(buffer, 0, bytesRead);
}
return output.toByteArray();
} catch (MalformedURLException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
protected void onPostExecute(byte[] result) {
ByteArrayInputStream imageStream = new ByteArrayInputStream(result);
Bitmap bm = BitmapFactory.decodeStream(imageStream);
bmImage.setImageBitmap(bm);
}
}
在activity
new DownloadImageTask((ImageView) newView.findViewById(R.id.thumbnail))
.execute("http://i.imgur.com/4GLKF4Q.jpg");
image URL 中的图像没有显示到 imageview。
在 Logcat 中:
09-23 10:26:49.410 10591-10591/com.*** D/skia: --- SkImageDecoder::Factory returned null
根据评论更新:将图像服务器更改为另一个可以解决问题。我想这是一个 i.imgur.com 的问题。
您不应该使用自己的图像加载器任务,它会在某处泄漏。
存在两个好的库:
- Fresco(来自 Facebook)
- Picasso(从 Square 向上)
还有UniversalImageLoader (UIL)。
我建议您查看 Facebook 的 Image Management Library 与其他图片加载相比,Fresco 非常棒且成熟图书馆.
Fresco 使用 3 层架构(BITMAP_MEMORY_CACHE
、ENCODED_MEMORY_CACHE
和 DISK_CACHE
)处理所有图像缓存。它还减少了 OOM(内存不足)问题。当视图中的图像超出屏幕时,它会自动回收位图,从而释放内存。
现在有一个 official way 从 URL 加载 ImageView 而不是使用 ImageView。
NetworkImageView—builds on ImageLoader and effectively replaces ImageView for situations where your image is being fetched over the network via URL. NetworkImageView also manages canceling pending requests if the view is detached from the hierarchy.
图像在后台线程中自动加载,视图在 UI 线程中更新。它甚至支持缓存。
我想从“http://i.imgur.com/4GLKF4Q.jpg”向 ImageView 显示图像,但是图像 URL 中的图像没有显示图像视图。我可以这样做吗?
异步任务
class DownloadImageTask extends AsyncTask<String, Void, byte[]> {
ImageView bmImage;
public DownloadImageTask(ImageView bmImage) {
this.bmImage = bmImage;
}
protected byte[] doInBackground(String... urls) {
try {
URL url = new URL(urls[0]);
InputStream is = (InputStream) url.getContent();
byte[] buffer = new byte[8192];
int bytesRead;
ByteArrayOutputStream output = new ByteArrayOutputStream();
while ((bytesRead = is.read(buffer)) != -1) {
output.write(buffer, 0, bytesRead);
}
return output.toByteArray();
} catch (MalformedURLException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
protected void onPostExecute(byte[] result) {
ByteArrayInputStream imageStream = new ByteArrayInputStream(result);
Bitmap bm = BitmapFactory.decodeStream(imageStream);
bmImage.setImageBitmap(bm);
}
}
在activity
new DownloadImageTask((ImageView) newView.findViewById(R.id.thumbnail))
.execute("http://i.imgur.com/4GLKF4Q.jpg");
image URL 中的图像没有显示到 imageview。 在 Logcat 中:
09-23 10:26:49.410 10591-10591/com.*** D/skia: --- SkImageDecoder::Factory returned null
根据评论更新:将图像服务器更改为另一个可以解决问题。我想这是一个 i.imgur.com 的问题。
您不应该使用自己的图像加载器任务,它会在某处泄漏。 存在两个好的库: - Fresco(来自 Facebook) - Picasso(从 Square 向上)
还有UniversalImageLoader (UIL)。
我建议您查看 Facebook 的 Image Management Library 与其他图片加载相比,Fresco 非常棒且成熟图书馆.
Fresco 使用 3 层架构(
BITMAP_MEMORY_CACHE
、ENCODED_MEMORY_CACHE
和DISK_CACHE
)处理所有图像缓存。它还减少了 OOM(内存不足)问题。当视图中的图像超出屏幕时,它会自动回收位图,从而释放内存。
现在有一个 official way 从 URL 加载 ImageView 而不是使用 ImageView。
NetworkImageView—builds on ImageLoader and effectively replaces ImageView for situations where your image is being fetched over the network via URL. NetworkImageView also manages canceling pending requests if the view is detached from the hierarchy.
图像在后台线程中自动加载,视图在 UI 线程中更新。它甚至支持缓存。