我见过这个问题:android how to download an 1mb image file and set to ImageView
它没有解决我的问题,因为它只显示了如何在之后显示位图。
我正在尝试从网址下载图片,以便在Android设备上显示ImageView。我不知道该怎么做。
我在互联网上看了一下,这是我到目前为止的代码:
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());
}
}
答案 0 :(得分:10)
代码可能会起作用,只要你在主线程上下载图像即可。这意味着当下载时间超过5秒时,您将看到着名的ANR对话框,您的应用程序将崩溃......
您应该在后台线程中下载图像,并将结果发回主线程。返回主线程,您可以使用下载的图像更新您的imageview。
以下是一个例子:
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添加到您的清单中,否则,您将收到错误...