Android大图像下载问题:内存不足
我正在尝试下载一个图像文件。在某些情况下,图像太大,中途会发出OfMemoryError。如何处理这种情况Android大图像下载问题:内存不足,android,image,download,out-of-memory,Android,Image,Download,Out Of Memory,我正在尝试下载一个图像文件。在某些情况下,图像太大,中途会发出OfMemoryError。如何处理这种情况 private class DownloadImage extends AsyncTask<String, Void, Bitmap> { @Override protected void onPreExecute() { super.onPreExecute();
private class DownloadImage extends AsyncTask<String, Void, Bitmap> {
@Override
protected void onPreExecute() {
super.onPreExecute();
mProgressDialog = new ProgressDialog(MainActivity.this);
mProgressDialog.setTitle("Download Image");
mProgressDialog.setMessage("Loading...");
mProgressDialog.setIndeterminate(false);
mProgressDialog.show();
}
@Override
protected Bitmap doInBackground(String... URL) {
String imageURL = URL[0];
Bitmap bitmap = null;
try {
// Download Image from URL
InputStream input = new java.net.URL(imageURL).openStream();
// Decode Bitmap
bitmap = BitmapFactory.decodeStream(input);
} catch (Exception e) {
e.printStackTrace();
}
return bitmap;
}
@Override
protected void onPostExecute(Bitmap result) {
// Set the bitmap into ImageView
image.setImageBitmap(result);
// Close progressdialog
mProgressDialog.dismiss();
}
}
私有类下载映像扩展异步任务{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
mProgressDialog=新建ProgressDialog(MainActivity.this);
setTitle(“下载图像”);
设置消息(“加载…”);
mProgressDialog.setUndeterminate(false);
mProgressDialog.show();
}
@凌驾
受保护位图doInBackground(字符串…URL){
字符串imageURL=URL[0];
位图=空;
试一试{
//从URL下载图像
InputStream输入=新的java.net.URL(imageURL.openStream();
//解码位图
位图=BitmapFactory.decodeStream(输入);
}捕获(例外e){
e、 printStackTrace();
}
返回位图;
}
@凌驾
受保护的void onPostExecute(位图结果){
//将位图设置为ImageView
image.setImageBitmap(结果);
//关闭进程对话框
mProgressDialog.disclose();
}
}
首先,您需要确定需要在哪个屏幕或屏幕部分显示它。您需要定义容器的结果大小(宽度和高度),以便在应用程序中显示您的图像。然后,当你收到你的图像时,你需要把它缩小到目标大小,然后才显示出来
这里有一大堆如何做的教程
但我建议您使用一个“加载图像”库毕加索就是一个很好的例子。请查看它首先,您需要确定需要在哪个屏幕或屏幕部分显示它。您需要定义容器的结果大小(宽度和高度),以便在应用程序中显示您的图像。然后,当你收到你的图像时,你需要把它缩小到目标大小,然后才显示出来 这里有一大堆如何做的教程
但我建议您使用一个“加载图像”库毕加索就是一个很好的例子。如果您不想使用像毕加索这样的库,请查看,您可以使用
Volley
去搜索NetworkImageView
,也许它会帮助你。这里有一个教程:
你也可以看看这个问题:
这里也是:如果你不想使用像毕加索这样的库,你可以使用
Volley
去搜索NetworkImageView
,也许它会帮助你。这里有一个教程:
你也可以看看这个问题:
这里也是:
在清单文件的应用程序标记中添加“android:largeHeap=true”
在清单文件的应用程序标记中添加“android:largeHeap=true”
你可以添加你尝试过的和logcat吗?我编辑了我的答案,也许你可以看看你可以添加你尝试过的和logcat吗?我编辑了我的答案,也许你可以看看Uppoted,但我想补充一点,如果OP出于任何原因不想使用毕加索,他/她应该通过
BufferedInputStreamReader
将URL流到一个文件中,然后使用图像的首选高度和宽度对该文件进行解码。向上投票,但我想补充一点,如果OP出于任何原因不想使用毕加索,他/她应该通过BufferedInputStreamReader
将URL流式传输到文件,然后使用图像的首选高度和宽度对该文件进行解码。