Log如下:
04-04 18:16:32.774: E/dalvikvm-heap(30873): 10036224-byte external allocation too large for this process.
04-04 18:16:32.805: E/GraphicsJNI(30873): VM won't let us allocate 10036224 bytes
04-04 18:16:32.813: D/dalvikvm(30873): GC_FOR_MALLOC freed 0K, 51% free 6259K/12615K, external 22123K/24171K, paused 22ms
04-04 18:16:32.813: D/skia(30873): --- decoder->decode returned false
04-04 18:16:32.813: W/dalvikvm(30873): threadid=15: thread exiting with uncaught exception (group=0x40015568)
04-04 18:16:32.821: E/AndroidRuntime(30873): FATAL EXCEPTION: AsyncTask #3
04-04 18:16:32.821: E/AndroidRuntime(30873): java.lang.RuntimeException: An error occured while executing doInBackground()
04-04 18:16:32.821: E/AndroidRuntime(30873): at android.os.AsyncTask$3.done(AsyncTask.java:200)
04-04 18:16:32.821: E/AndroidRuntime(30873): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
04-04 18:16:32.821: E/AndroidRuntime(30873): at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
04-04 18:16:32.821: E/AndroidRuntime(30873): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
04-04 18:16:32.821: E/AndroidRuntime(30873): at java.util.concurrent.FutureTask.run(FutureTask.java:138)
04-04 18:16:32.821: E/AndroidRuntime(30873): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
04-04 18:16:32.821: E/AndroidRuntime(30873): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
04-04 18:16:32.821: E/AndroidRuntime(30873): at java.lang.Thread.run(Thread.java:1019)
04-04 18:16:32.821: E/AndroidRuntime(30873): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget
04-04 18:16:32.821: E/AndroidRuntime(30873): at android.graphics.BitmapFactory.nativeDecodeByteArray(Native Method)
04-04 18:16:32.821: E/AndroidRuntime(30873): at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:419)
04-04 18:16:32.821: E/AndroidRuntime(30873): at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:432)
04-04 18:16:32.821: E/AndroidRuntime(30873): at com.jiadebin.ar.arnavigator.ARDetailActivity$wsAsyncTask.doInBackground(ARDetailActivity.java:220)
04-04 18:16:32.821: E/AndroidRuntime(30873): at com.jiadebin.ar.arnavigator.ARDetailActivity$wsAsyncTask.doInBackground(ARDetailActivity.java:1)
04-04 18:16:32.821: E/AndroidRuntime(30873): at android.os.AsyncTask$2.call(AsyncTask.java:185)
04-04 18:16:32.821: E/AndroidRuntime(30873): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
04-04 18:16:32.821: E/AndroidRuntime(30873): ... 4 more
我的程序是在一个activity里用一个AsyncTask在后台加载Bitmap图片(从网络服务器上加载),这个activity被调用两次之后就不能继续调用了,第三次调用时就出现了这个问题然后程序异常退出,看Log里说貌似是每一次调用加载线程之后,这个线程并没有从内存中销毁,而是继续存在,所以导致后面再次新建该类线程时,内存泄露啦!
在网上找了一下,遇到这类问题的人很多,通常的原因就是我们加载的图片太大,我看了一下我的图片,用500W像素的Defy拍的,原始大小一般都在800KB左右,这样大的图片才导致了内存泄露,网上大神们给的通常的解决方法是,用BitmapFactory解码时加上设置好的options指令(我就是没用options),通常Options如下设定:
BitmapFactory.Options options=new Options();
options.inDither=false; /*不进行图片抖动处理*/
options.inPreferredConfig=null; /*设置让解码器以最佳方式解码*/
options.inSampleSize=4; /*图片长宽方向缩小倍数*/
Bitmapimg=BitmapFactory.decodeByteArray(buffer, 0, buffer.length, options);
这样修改后,我发现传到手机上的图片一般都是200KB左右了,即缩小为原来的1/4,而且看起来还行,没怎么失真,几乎不影响观看效果,问题也解决了~
对了,最好在你使用完Bitmap之后,调用一下recycle()方法,这样更有利于内存回收。
分享到:
相关推荐
Android编写驱动程序案例
Android Studio 3.0 编写的素数查询小程序,适合新手教学,很简易!
content.zip//解压到tomcat/webapps/下面 修改content.xml中的图片路径的IP asynclload.zip//解压后为用eclipse编写网络异步加 载数据,异步加载图片并把图片保存到sdcard中
如果你想切实体会Android应用开发之道,如果你是一个刚刚入门的Android爱好者,那么这个程序将帮助你分析android程序的精髓。。。
主要和大家一起动手编写Android图片加载框架,从内部原理到具体实现来详细介绍如何开发一个简洁而实用的Android图片加载缓存框架,感兴趣的小伙伴们可以参考一下
用VC编写的加载BMP图片的小例子,点击确定按钮调出图片对话框,选择图片即可加载。
如何编写动态连接库程序呢,该程序为编写DLL,加载DLL,并测试DLL的经典例子。
mandala, 一个编写原生Android应用程序 Mandala Mandala是一个框架,用于在中编写Android原生应用程序,使用 Goandroid工具链。 你可以在桌面上开发。测试和运行你的应用程序,然后将它的部署到Android设备上。 它...
这是一个以c++为基础编写的一个测试内存的程序,仅用于学习交流
C语言实现的一个内存泄漏检测程序,可方便地嵌入到你的工程中进行内存泄漏检测!很好用的!
LazyLoad 图片延迟加载效果示例 LazyLoad 图片延迟加载效果示例,这是由cloudgamer编写的一个封装插件,用它可以完成不少的效果,现在这个是图片延迟效果,也就是说,我们需要显示的图片会先加载,暂时用不上的也就...
编写Android系统服务代码案例编写
图片异步加载并缓存,详解Android-Universal-Image-Loader,提供Android studio编写的工程文件代码的下载,只要导入工程文件,运行里面的app就可以了
1、采用异步加载的机制。 2、编写自定义适配器。 3、本例中传的是数组,可根据个人需要传list集合等。
JAVA编写记事本程序,已做好!!!!!!!!!!!!!!!1
DelphiXE 10.2编写Android程序 ,通过蓝牙接口控制程序,能扫描蓝牙模块,并且连接HC-08C 蓝牙模块,与该模块进行数据交互。
文本来自StackOverflow问答网站的一个热门讨论:如何用Java编写一段会发生内存泄露的代码。 Q:刚才我参加了面试,面试官问我如何写出会发生内存泄露的Java代码。这个问题我一点思路都没有,好?。 A1:通过...
android 插件 android动态加载类
独家教程 用PHP编写Android应用程序
ABAQUS激光加载子程序Dflux编写的源程序和讲解说明