在 android 中将图像下载到位图文件中
Download an image into Bitmap file in android
我一直在尝试将图像下载到位图元素中,以便将它们加载到带有图像的 gridView 中,但我需要异步进行,因为如果不这样做,就会出现错误 "android.os.NetworkOnMainThreadException"。
通过搜索,我发现有很多教程可以做到这一点,但所有教程都在完成后将此元素添加到 ImageView。
除了位图,还有什么办法可以做到这一点吗?
这里我找到了不用异步下载的方法:
URL url = new URL("http://....");
Bitmap image = BitmapFactory.decodeStream(url.openConnection().getInputStream());
还有一个:
public static Bitmap getBitmapFromURL(String src) {
try {
URL url = new URL(src);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
Bitmap myBitmap = BitmapFactory.decodeStream(input);
return myBitmap;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
Android load from URL to Bitmap
将您的 getBitmapFromURL
方法包装成 AsyncTask
,见下文:
private class GetBitmapFromURLAsync extends AsyncTask<String, Void, Bitmap> {
@Override
protected Bitmap doInBackground(String... params) {
return getBitmapFromURL(params[0]);
}
@Override
protected void onPostExecute(Bitmap bitmap) {
}
}
将上述 AsyncTask
嵌套到您的 Activity:
public class MyActivity extends Activity {
// To store the Bitmap returned by doInBackground asynctask
private Bitmap result;
// existing Activity code
...
private class GetBitmapFromURLAsync extends AsyncTask<String, Void, Bitmap> {
@Override
protected Bitmap doInBackground(String... params) {
return getBitmapFromURL(params[0]);
}
@Override
protected void onPostExecute(Bitmap bitmap) {
// return the bitmap by doInBackground and store in result
result = bitmap;
}
}
并调用上面的代码:
GetBitmapFromURLAsync getBitmapFromURLAsync = new GetBitmapFromURLAsync();
getBitmapFromURLAsync.execute("http://....");
您不能在 android 中从主 (UI) 线程进行诸如 http 请求之类的繁重操作。或者你会得到那个错误。您可以使用 AsyncTask.
class ImageDownloadTask extends AsyncTask<String, Void, Bitmap> {
//this operation is in backgrouund
@Override
protected Bitmap doInBackground(String... params) {
return getBitmapFromURL(params[0]);
}
//operation is finished, update the UI with bitmap
@Override
protected void onPostExecute(Bitmap bitmap) {
}
}
或者只使用 Picasso 库,它会为您完成所有工作,包括缓存。
Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);
我一直在尝试将图像下载到位图元素中,以便将它们加载到带有图像的 gridView 中,但我需要异步进行,因为如果不这样做,就会出现错误 "android.os.NetworkOnMainThreadException"。
通过搜索,我发现有很多教程可以做到这一点,但所有教程都在完成后将此元素添加到 ImageView。 除了位图,还有什么办法可以做到这一点吗?
这里我找到了不用异步下载的方法:
URL url = new URL("http://....");
Bitmap image = BitmapFactory.decodeStream(url.openConnection().getInputStream());
还有一个:
public static Bitmap getBitmapFromURL(String src) {
try {
URL url = new URL(src);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
Bitmap myBitmap = BitmapFactory.decodeStream(input);
return myBitmap;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
Android load from URL to Bitmap
将您的 getBitmapFromURL
方法包装成 AsyncTask
,见下文:
private class GetBitmapFromURLAsync extends AsyncTask<String, Void, Bitmap> {
@Override
protected Bitmap doInBackground(String... params) {
return getBitmapFromURL(params[0]);
}
@Override
protected void onPostExecute(Bitmap bitmap) {
}
}
将上述 AsyncTask
嵌套到您的 Activity:
public class MyActivity extends Activity {
// To store the Bitmap returned by doInBackground asynctask
private Bitmap result;
// existing Activity code
...
private class GetBitmapFromURLAsync extends AsyncTask<String, Void, Bitmap> {
@Override
protected Bitmap doInBackground(String... params) {
return getBitmapFromURL(params[0]);
}
@Override
protected void onPostExecute(Bitmap bitmap) {
// return the bitmap by doInBackground and store in result
result = bitmap;
}
}
并调用上面的代码:
GetBitmapFromURLAsync getBitmapFromURLAsync = new GetBitmapFromURLAsync();
getBitmapFromURLAsync.execute("http://....");
您不能在 android 中从主 (UI) 线程进行诸如 http 请求之类的繁重操作。或者你会得到那个错误。您可以使用 AsyncTask.
class ImageDownloadTask extends AsyncTask<String, Void, Bitmap> {
//this operation is in backgrouund
@Override
protected Bitmap doInBackground(String... params) {
return getBitmapFromURL(params[0]);
}
//operation is finished, update the UI with bitmap
@Override
protected void onPostExecute(Bitmap bitmap) {
}
}
或者只使用 Picasso 库,它会为您完成所有工作,包括缓存。
Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);