问题描述
我见过这个问题:android 如何下载 1mb 图像文件并设置为 ImageView
它没有解决我的问题,因为它只显示了如何在您已经拥有位图之后显示.
我正在尝试从 URL 下载图像,以便在 Android 设备上使用 ImageView 显示它.我不知道该怎么做.
I am trying to download an image from a URL to have it be displayed with an ImageView on an Android device. I am not sure how to do this.
我在互联网上环顾了一下,这是我目前拥有的代码:
I've looked around a bit on the internet, this is the code I have so far:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//Set local image
ImageView image = (ImageView) findViewById(R.id.test_image);
image.setImageResource(R.drawable.test2);
//Prepare to download image
URL url;
InputStream in;
//BufferedInputStream buf;
try {
url = new URL("http://i.imgur.com/CQzlM.jpg");
in = url.openStream();
out = new BufferedOutputStream(new FileOutputStream("testImage.jpg"));
int i;
while ((i = in.read()) != -1) {
out.write(i);
}
out.close();
in.close();
buf = new BufferedInputStream(in);
Bitmap bMap = BitmapFactory.decodeStream(buf);
image.setImageBitmap(bMap);
if (in != null) {
in.close();
}
if (buf != null) {
buf.close();
}
} catch (Exception e) {
Log.e("Error reading file", e.toString());
}
}
推荐答案
代码可能会起作用,尽管您是在主线程上下载图像.这意味着当下载时间超过 5 秒时,您将看到著名的 ANR 对话框,并且您的应用程序将崩溃...
The code would probably work, alltough you are downloading your image on your main thread. This means that when it takes more than 5 seconds to download, you will be presented with the famous ANR dialog, and your app will crash...
您应该在后台线程中下载您的图像,然后将结果发布回您的主线程.回到主线程,你可以用下载的图像更新你的图像视图.
You should download your image in a background thread, and post the result back to your main thread. Back in the main thread, you can update your imageview with the downloaded image.
这是一个例子:
package nl.entreco.stackoverflow;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.ImageView;
public class StackOverflowActivity extends Activity {
//
private ImageView mImageView;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//Find the reference to the ImageView
mImageView = (ImageView) findViewById(R.id.test_image);
// You can set a temporary background here
//image.setImageResource(null);
// Start the DownloadImage task with the given url
new DownloadImage().execute("http://i.imgur.com/CQzlM.jpg");
}
/**
* Simple functin to set a Drawable to the image View
* @param drawable
*/
private void setImage(Drawable drawable)
{
mImageView.setBackgroundDrawable(drawable);
}
public class DownloadImage extends AsyncTask<String, Integer, Drawable> {
@Override
protected Drawable doInBackground(String... arg0) {
// This is done in a background thread
return downloadImage(arg0[0]);
}
/**
* Called after the image has been downloaded
* -> this calls a function on the main thread again
*/
protected void onPostExecute(Drawable image)
{
setImage(image);
}
/**
* Actually download the Image from the _url
* @param _url
* @return
*/
private Drawable downloadImage(String _url)
{
//Prepare to download image
URL url;
BufferedOutputStream out;
InputStream in;
BufferedInputStream buf;
//BufferedInputStream buf;
try {
url = new URL(_url);
in = url.openStream();
/*
* THIS IS NOT NEEDED
*
* YOU TRY TO CREATE AN ACTUAL IMAGE HERE, BY WRITING
* TO A NEW FILE
* YOU ONLY NEED TO READ THE INPUTSTREAM
* AND CONVERT THAT TO A BITMAP
out = new BufferedOutputStream(new FileOutputStream("testImage.jpg"));
int i;
while ((i = in.read()) != -1) {
out.write(i);
}
out.close();
in.close();
*/
// Read the inputstream
buf = new BufferedInputStream(in);
// Convert the BufferedInputStream to a Bitmap
Bitmap bMap = BitmapFactory.decodeStream(buf);
if (in != null) {
in.close();
}
if (buf != null) {
buf.close();
}
return new BitmapDrawable(bMap);
} catch (Exception e) {
Log.e("Error reading file", e.toString());
}
return null;
}
}
}
不要忘记将permission.INTERNET添加到您的清单中,如果没有,您将收到错误...
Don't forget to add the permission.INTERNET to your manifest, if not, you will get an error...
这篇关于下载图像以在 Android 上查看图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!