Android:dalvikvmheap﹕;内存不足
这里我从服务器上一个接一个地下载图像。获取dalvikvm堆的错误信息﹕ 运行应用程序时,31961104字节分配内存不足,中途崩溃。有时下载图像,有时不下载。但我想从下载中在Listview中添加图像 这是我的下载代码Android:dalvikvmheap﹕;内存不足,android,Android,这里我从服务器上一个接一个地下载图像。获取dalvikvm堆的错误信息﹕ 运行应用程序时,31961104字节分配内存不足,中途崩溃。有时下载图像,有时不下载。但我想从下载中在Listview中添加图像 这是我的下载代码 private Bitmap downloadBitmap(String url) { final DefaultHttpClient client = new DefaultHttpClient(); final Ht
private Bitmap downloadBitmap(String url) {
final DefaultHttpClient client = new DefaultHttpClient();
final HttpGet getRequest = new HttpGet(url);
try {
HttpResponse response = client.execute(getRequest);
//check 200 OK for success
final int statusCode = response.getStatusLine().getStatusCode();
if (statusCode != HttpStatus.SC_OK) {
Log.w("ImageDownloader", "Error " + statusCode +
" while retrieving bitmap from " + url);
return null;
}
final HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream inputStream = null;
try {
// getting contents from the stream
inputStream = entity.getContent();
// decoding stream data back into image Bitmap that android understands
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 1;
final Bitmap bitmap = BitmapFactory.decodeStream(inputStream, null, options);
// final Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
File file = new File(newFolder, imageName);
if (file.exists()) file.delete();
try
{
FileOutputStream out = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
out.flush();
out.close();
int imagenObtenidaW = bitmap.getWidth();
int imagenObtenidaH = bitmap.getHeight();
Log.e("imagenObtenidaW " ," = +" + imagenObtenidaW + " imagenObtenidaH = " + imagenObtenidaH);
} catch (Exception e) {
}
return bitmap;
} finally {
if (inputStream != null) {
inputStream.close();
}
entity.consumeContent();
}
}
} catch (Exception e) {
// You Could provide a more explicit error message for IOException
getRequest.abort();
Log.e("ImageDownloader", "Something went wrong while" +
" retrieving bitmap from " + url + e.toString());
}
return null;
}
here is my code form download in the same Activity.
if (imageName.endsWith(png_Pattern) || imageName.endsWith(jpg_pattern) || imageName.endsWith(bmp_pattern) || imageName.endsWith(gif_pattern) || imageName.endsWith(jpeg_pattern))
{
str_DownLoadUrl = namespace + "/DownloadFile/FileName/" + imageName;
Log.e("@@@@@", "str_DownLoadUrl = " + str_DownLoadUrl);
//download_PngFile(str_DownLoadUrl);
downloadBitmap(str_DownLoadUrl);
strDownLoadStatus = "1";
dbhelper.update_DownLoadStatus(imageName, strDownLoadStatus);
}
}
这是我的日志
1.414 10598-10601/com.example.tazeen.classnkk D/dalvikvm﹕ GC_CONCURRENT freed 1738K, 57% free 15379K/35335K, paused 5ms+7ms
10-13 14:52:11.963 10598-10826/com.example.tazeen.classnkk D/dalvikvm﹕ GC_FOR_ALLOC freed 64K, 57% free 15377K/35335K, paused 95ms
10-13 14:52:11.963 10598-10826/com.example.tazeen.classnkk I/dalvikvm-heap﹕ Forcing collection of SoftReferences for 31961104-byte allocation
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk D/dalvikvm﹕ GC_BEFORE_OOM freed 9K, 57% free 15368K/35335K, paused 68ms
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk E/dalvikvm-heap﹕ Out of memory on a 31961104-byte allocation.
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk I/dalvikvm﹕ "AsyncTask #2" prio=5 tid=13 RUNNABLE
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk I/dalvikvm﹕ | group="main" sCount=0 dsCount=0 obj=0x42ad4188 self=0x1edbd8
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk I/dalvikvm﹕ | sysTid=10826 nice=10 sched=0/0 cgrp=bg_non_interactive handle=1591808
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk I/dalvikvm﹕ | schedstat=( 12449561867 3389288161 878 ) utm=1181 stm=63 core=0
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk I/dalvikvm﹕ at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk I/dalvikvm﹕ at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:493)
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk I/dalvikvm﹕ at com.example.tazeen.classnkk.AllPosts_Page.downloadBitmap(AllPosts_Page.java:1220)
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk I/dalvikvm﹕ at com.example.tazeen.classnkk.AllPosts_Page.getDoenLoaddata(AllPosts_Page.java:738)
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk I/dalvikvm﹕ at com.example.tazeen.classnkk.AllPosts_Page$GetgetDoenLoaddata.doInBackground(AllPosts_Page.java:700)
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk I/dalvikvm﹕ at com.example.tazeen.classnkk.AllPosts_Page$GetgetDoenLoaddata.doInBackground(AllPosts_Page.java:696)
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk I/dalvikvm﹕ at android.os.AsyncTask$2.call(AsyncTask.java:264)
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk I/dalvikvm﹕ at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk I/dalvikvm﹕ at java.util.concurrent.FutureTask.run(FutureTask.java:137)
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk I/dalvikvm﹕ at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk I/dalvikvm﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk I/dalvikvm﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk I/dalvikvm﹕ at java.lang.Thread.run(Thread.java:856)
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk I/dalvikvm﹕ [ 10-13 14:52:12.034 10598:0x2a4a D/skia ]
--- decoder->decode returned false
如何解决此问题。当您下载图像,并且在下载一些图像后没有分配给应用程序的内存时,会出现此问题。有各种图像加载库,使您的工作更容易:,等等
SimpleDraweView
作为自定义图像视图,支持圆角和圆
,支持动画(.gif、.webp)和普通图像(.jpg、.png)编码内存缓存
和磁盘缓存
)处理图像的所有缓存。它还减少了OOM(内存不足)问题。当视图中的图像离开屏幕时,它会自动回收位图,从而释放内存android:largeHeap=“true”
来增加分配给应用程序的内存
注意:为应用程序增加堆
并不是理想的解决方案
这是谷歌的摘录解释了这一点
但是,请求大型堆的功能仅适用于
可以证明需要消耗更多RAM的一小部分应用程序(例如
作为一个大型照片编辑应用程序)。不要简单地请求一个大堆
因为您的内存不足,需要快速修复,您应该
只有当你确切地知道你所有的记忆都在哪里时才使用它
分配以及为什么必须保留。然而,即使你很自信
你的应用程序可以证明大堆的合理性,你应该避免请求它
尽可能多。使用额外的内存将越来越困难
因为垃圾而损害了整体用户体验
收集将花费更长的时间,并且当
任务切换或执行其他常见操作
这是文档的完整链接android:largerHeap=“true”您是否在清单文件中设置了此项?为什么不使用图像加载库在列表视图中添加图像?添加
android:largerHeap=“true”
不是处理此问题的正确方法。android:largerHeap=“true”在应用程序标记中或应用程序标记之前添加此行