在我的应用程序中,我使用图像的网址从网上下载图像。我有很多图像所以我为此实现了分页技术,我按垂直顺序为每个页面显示了15个图像。在这种情况下,我在页面上下滚动查看图像,此时我的应用程序崩溃,我的内存异常。请任何人帮助我。
logcat的:
02-07 11:23:52.256: ERROR/ACRA(7236): El Gifto fatal error : bitmap size exceeds VM budget(Heap Size=7943KB, Allocated=3485KB, Bitmap Size=12546KB)
02-07 11:23:52.256: ERROR/ACRA(7236): java.lang.OutOfMemoryError: bitmap size exceeds VM budget(Heap Size=7943KB, Allocated=3485KB, Bitmap Size=12546KB)
02-07 11:23:52.256: ERROR/ACRA(7236): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
02-07 11:23:52.256: ERROR/ACRA(7236): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:690)
02-07 11:23:52.256: ERROR/ACRA(7236): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:490)
02-07 11:23:52.256: ERROR/ACRA(7236): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
02-07 11:23:52.256: ERROR/ACRA(7236): at android.graphics.drawable.Drawable.createFromStream(Drawable.java:657)
02-07 11:23:52.256: ERROR/ACRA(7236): at com.ibkr.elgifto.GiftCategories$itemlistadapter$3.getDrawableFromUrl(GiftCategories.java:837)
02-07 11:23:52.256: ERROR/ACRA(7236): at com.ibkr.elgifto.GiftCategories$itemlistadapter$3.run(GiftCategories.java:724)
这是我的代码:
public void DownLoadImageInAThreadHandler(final CategoryData Item, final ViewHolder holder)
{
final Handler handler = new Handler()
{
@Override public void handleMessage(Message message)
{
holder.imgitem.setImageDrawable((Drawable) message.obj);
holder.imgitem.setVisibility(View.VISIBLE);
holder.progress.setVisibility(View.GONE);
}
};
//Thread for getting the attributes values
Thread t = new Thread()
{
public void run()
{
try
{
drawable = getDrawableFromUrl(Item.ImageUrl);
if(drawable != null)
{
//Send the message to the handler
Message message = handler.obtainMessage(1, drawable);
handler.sendMessage(message);
}
else
{
int idNoImage = R.drawable.giftsuggestionsnoimage;
Drawable dwgNoImg = GiftCategories.this.getResources().getDrawable(idNoImage);
//Send the message to the handler
Message message = handler.obtainMessage(1, dwgNoImg);
handler.sendMessage(message);
}
}
catch(Exception exp)
{
System.out.println("Exception in DownLoadImageInAThread : " + exp.getMessage());
}
}
private Drawable getDrawableFromUrl(String imageUrl) throws IOException
{
Drawable image = null;
try
{
InputStream in = (java.io.InputStream) new java.net.URL(imageUrl).getContent();
if (in != null)
{
image = Drawable.createFromStream(in, "image");
in.close();
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
return image;
}
};
t.start();
}
答案 0 :(得分:0)
如果您遇到内存问题,那么您必须选择两个选项 首先=>您必须使用Bitmap解码图像 或秒=>下载图像并将其保存在临时文件夹中。用它。当你不需要删除文件夹中的所有文件时。
对于下载图像并将其保存在文件夹check this link
中用于解码Check this link from stackoverflow。 也许这会对你有所帮助。 感谢
答案 1 :(得分:0)
在ICS之前的手机上,dalvik堆上创建了位图,并且在终结器中调用了内存清理,而终结器不是银色的bul http://code.google.com/p/android/issues/detail?id=8488
使用位图对象并确保调用循环方法
答案 2 :(得分:0)
这是一个常见的问题,我认为你应该为你的位图使用一个SoftReference集合。检查SoftReference的doc和online ressource:它将允许Android在需要时清除位图占用的空间。