我正在尝试从服务器下载图像并将其保存在android的内部存储中。如果我下载的图像小于2 MB,它在所有情况下都运行良好。但是当我下载任何大小超过2 MB的JPEG图像时,我面临两个问题。
首先,当我尝试使用模拟器从服务器下载并保存图像时,我收到的错误如“位图大小超过VM预算”和活动崩溃。
第二个问题是,当我在手机上运行应用程序时,问题不在于它,而是发生了另一个问题。当我显示下载的图像时,图像也包含一些其他颜色(彩虹色)。
以下是我用来下载和保存图片的代码:
//For downloading the image file
void downloadFile(String fileUrl)
{
URL myFileUrl = null;
try {
myFileUrl = new URL(fileUrl);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try
{
HttpURLConnection conn = (HttpURLConnection) myFileUrl .openConnection();
conn.setDoInput(true);
conn.connect();
InputStream is = conn.getInputStream();
bmImg = BitmapFactory.decodeStream(is);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//For saving the downloaded image
void saveImage() {
try
{
String fileName ="displayimg.png";
final FileOutputStream fos = openFileOutput(fileName, Activation.MODE_PRIVATE);
bmImg.compress(CompressFormat.PNG, 90, fos);
} catch (Exception e)
{
e.printStackTrace();
}
}
以下是显示图片的代码:
private Bitmap myBitmap;
myBitmap= BitmapFactory.decodeFile(imgFile.getAbsolutePath());
ivDisplayImage.setImageBitmap(myBitmap);
答案 0 :(得分:3)
您的代码存在一些问题,首先是您尝试使用png格式压缩图像,png格式不要压缩。你应该使用jpeg。这将减少图像尺寸和质量。第二件事是有一种非常有效的方式来下载图像并在imageview中显示,这里是链接:Displaying Bitmaps Efficiently它还解释了你的第一个问题 java.lang.OutofMemoryError:位图大小超过VM预算。 并且有一些好的库我建议你使用像
这样的主题答案 1 :(得分:2)
答案 2 :(得分:1)
您可以使用Universal Image Loader。 https://github.com/nostra13/Android-Universal-Image-Loader。异步下载图像。您可以将图像缓存在内存或SD卡中。
您还可以查看延迟加载https://github.com/thest1/LazyList。
在不使用时也回收位图。
bitmap.recycle();
要有效加载bitmpas,请参阅链接中的文档。 http://developer.android.com/training/displaying-bitmaps/load-bitmap.html
java.lang.OutofMemoryError:位图大小超过VM预算意味着您有内存泄漏。 http://android-developers.blogspot.de/2009/01/avoiding-memory-leaks.html
http://www.youtube.com/watch?v=_CruQY55HOk。谈论内容管理和避免内存泄漏。还解释了如何使用MAT Analyzer查找内存泄漏。
Bitmap color change while compressing to png。检查可能与您的问题相关的答案。还要检查手机正在运行的Android版本。
答案 3 :(得分:0)
嘿,我建议你使用这个库:http://loopj.com/android-async-http/
以下是示例代码:
AsyncHttpClient client = new AsyncHttpClient();
String[] allowedContentTypes = new String[] { "image/jpeg" }; // here you need to type the mimetype of the file
client.get("link to jpg or any image"),
new BinaryHttpResponseHandler(allowedContentTypes) {
@Override
public void onSuccess(byte[] fileData) {
// this means it downloaded succesfully and you could make a filoutputstream to sdcard
FileOutputStream fos;
try {
fos = new FileOutputStream(Environment
.getExternalStorageDirectory()
+ "/Images/test.jpg");
fos.write(fileData);
fos.close();
fos.flush();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// here you could set it to an imageview or do anything you wouyld like
}
}
});
}
如果您有任何问题,请告诉我。