FAILED BINDER TRANSACTION 跪求andorid开发高手解惑

ming9317733 2015-09-28 04:49:25
关键词:android 开发 内存不够 bitmap

先贴错误信息:
09-28 13:40:21.335: D/skia(6135): ------- imageref_ashmem create failed <(null)> 163840
...
09-28 13:40:21.921: E/JavaBinder(6135): !!! FAILED BINDER TRANSACTION !!!
09-28 13:40:21.928: W/System.err(6135): java.lang.RuntimeException: Adding window failed
... ...
09-28 13:40:21.936: W/System.err(6135): Caused by: android.os.TransactionTooLargeException
09-28 13:40:21.936: W/System.err(6135): at android.os.BinderProxy.transact(Native Method)
...
09-28 13:45:27.085: E/SurfaceTextureClient(6135): dequeueBuffer: ISurfaceTexture::requestBuffer failed: -2147483646
09-28 13:45:27.085: E/IMGSRV(6135): :0: DequeueLockStoreBuffer: Failed to de-queue buffer
09-28 13:45:27.085: W/HardwareRenderer(6135): EGL error: EGL_BAD_NATIVE_WINDOW
09-28 13:45:27.116: W/HardwareRenderer(6135): Mountain View, we've had a problem here. Switching back to software rendering.

问题描述:
1、点击按钮A,弹出一个dialog,这个dialog内含有大量bitmap
2、dialog内有按钮B,点击后dialog cancel,并对dialog内的bitmap逐个recycle
3、不断关闭打开dialog连续进行7次后,应用会出现无法响应状态,并不是EXCEPTION,而是ERROR,后台日志见上。

个人推断是内存不足引起,经过DDMS跟踪查看,发现整个操作过程中data object的total size确实是有增无减,但整个应用吃内存的只有BITMAP,且都有及时释放,排查多日,始终找不到结症所在,有高手能看出端倪吗?
...全文
11334 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ming9317733 2015-09-29
  • 打赏
  • 举报
回复
问题解决,子线程实例化的BITMAP,主线程没法RECYLE
ming9317733 2015-09-28
  • 打赏
  • 举报
回复
引用 1 楼 u010911576 的回复:
贴代码 !!!
不好意思,代码格式太乱,重新贴一下。 点击按钮A: //显示loading MyMessage.showLoading(this,screenWidth,screenHeight); //这一步必须在主线程做,否则dialog无法在主线程关闭 myMessage.createBox(width,height*7/10); //启动线程加载BOX,handler通知主线程开启dialog界面 BackThread t = new BackThread(this,DBM,0,0,handler,flag,Params.THREAD_NAME_INIT_BOX); t.start(); //线程加入线程列表 threadList.add(t); 点击按钮B: //关闭dialog if (dialogBox != null) { dialogBox.cancel(); dialogBox = null; } //资源回收 ResourceManager.clearResource(ResourceManager.RESOURCE_MODEL_BOX); 主线程handdle: if(dialogBox!=null){ dialogBox.show(); //位置设置 dialogBox.setPosition(Gravity.BOTTOM, Gravity.CENTER); } 图片加载: // id:图片ID //iv:存放图片的imageview BitmapFactory.Options opt = new BitmapFactory.Options(); opt.inPreferredConfig = Bitmap.Config.RGB_565; opt.inPurgeable = true; opt.inInputShareable = true; InputStream is = context.getResources().openRawResource(id); Bitmap bitmap = BitmapFactory.decodeStream(is, null, opt); iv.setImageBitmap(bitmap); 这里dialogBox是一个单例模式,线程BackThread会给dialogBox添加一堆控件,包括大量bitmap,这些控件都是适时new出来的,不做内存管理(bitmap除外,bitmap会在new出来时添加到一个list里,在“资源回收”步骤里会对这部分bitmap做recyle) 另: 刚又做了一次测试,在handler打开dialog的代码后面加入按钮B的代码,再在handler尾部添加按钮A的代码, 即dialog初始化->打开->立刻关闭->再次初始化->打开->立刻关闭,这样调整代码进行测试后,发现后台没有error了,查看内存的变化曲线跟之前报错是一致的。这是否说明这个error是在绘图时产生的,而非分配内存时?
ming9317733 2015-09-28
  • 打赏
  • 举报
回复
引用 1 楼 u010911576 的回复:
贴代码 !!!
点击按钮A: //显示loading MyMessage.showLoading(this,screenWidth,screenHeight); //这一步必须在主线程做,否则dialog无法在主线程关闭 myMessage.createBox(width,height*7/10); //启动线程加载BOX,handler通知主线程开启dialog界面 BackThread t = new BackThread(this,DBM,0,0,handler,flag,Params.THREAD_NAME_INIT_BOX); t.start(); //线程加入线程列表 threadList.add(t); 点击按钮B: //关闭dialog if (dialogBox != null) { dialogBox.cancel(); dialogBox = null; } //资源回收 ResourceManager.clearResource(ResourceManager.RESOURCE_MODEL_BOX); 主线程handdle: if(dialogBox!=null){ dialogBox.show(); //位置设置 dialogBox.setPosition(Gravity.BOTTOM, Gravity.CENTER); } 图片加载: // id:图片ID //iv:存放图片的imageview BitmapFactory.Options opt = new BitmapFactory.Options(); opt.inPreferredConfig = Bitmap.Config.RGB_565; opt.inPurgeable = true; opt.inInputShareable = true; InputStream is = context.getResources().openRawResource(id); Bitmap bitmap = BitmapFactory.decodeStream(is, null, opt); iv.setImageBitmap(bitmap); 这里dialogBox是一个单例模式,线程BackThread会给dialogBox添加一堆控件,包括大量bitmap,这些控件都是适时new出来的,不做内存管理(bitmap除外,bitmap会在new出来时添加到一个list里,在“资源回收”步骤里会对这部分bitmap做recyle) 另: 刚又做了一次测试,在handler打开dialog的代码后面加入按钮B的代码,再在handler尾部添加按钮A的代码, 即dialog初始化->打开->立刻关闭->再次初始化->打开->立刻关闭,这样调整代码进行测试后,发现后台没有error了,查看内存的变化曲线跟之前报错是一致的。这是否说明这个error是在绘图时产生的,而非分配内存时?
jklwan 2015-09-28
  • 打赏
  • 举报
回复
显示图片用图片加载库,不用自己写,会自动管理内存,一般都不会出问题。 Caused by: android.os.TransactionTooLargeException是传递参数太大造成的。
_deadline 2015-09-28
  • 打赏
  • 举报
回复
贴代码 !!!

80,472

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧