notification复用中抛出can not parcel recyle’s bitmap

原创 2016年05月30日 23:24:42

由于对android重用思想的根深蒂固,所以我在使用通知的使用并不是stop之后再次start,而是只存在一个对象,直接startforgeound,

但是在remoteview中将之前bitmap.recyle时,会出现can not parcel recyle’s bitmap,bitmap

原始代码是这样的.

bitmap(之前通知现实的图片)

bitmap.recyle();

mRemoteView.setImageViewResource(R.id.notification_bg, R.drawable.log);

startForeground();

 

foreground死掉了,为什么呢?我发现每次执行与bitmap相关的方法,remoteviews中的bitmapcache都会去获取ID,这个ID就是bitmapcache中的index,因为removateviews的缺陷,导致并非我们设置bitmapnull时便会移除原本的action(remoteviews中的内部类,每次执行关于bitmap的方法都会new一个新的,添加到默认数组中),这就导致bitmapcache中的arraylist<bitmap>只增不减,为此我们无法将bitmap进行recyle,如果我们recyle便会抛出can not parcel recyle’s bitmap 错误,因为它竟然将bitmapcache中的arraylist<bitmap>全部parcel,如果我们不recyle,就会导致gc亚历山大的问题(我是想重用notification的,虽然google不建议我们重用,因为可能引起ANR,但是呢,重用如果只有单一功能的notification,重用还是有价值的,毕竟用户不希望在重复刷新nofication时,内存直升太过明显,那显然是很操蛋的体验,不要太相信GC线程,比如service只用了2M,而由于频繁操作,heap到达了10M,那么这个10M显示在应用程序列表里会持续很长时间),解决方法很简单:

private boolean removeBitmapCache() {
try {
Object obj = Tool.getField(mRemoteView, "mBitmapCache").get(mRemoteView);
if (obj != null) {
List<Bitmap> mps = (List<Bitmap>) Tool.getField(obj, "mBitmaps").get(obj);
if (mps != null) {
mps.clear();
return true;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}


 

使用java反射,得到bitmapcachearraylist,进行清空.

版权声明:本文为博主原创文章,未经博主允许不得转载。

通知(二)你可能不知道的Notification用法

Notificaton不会打断Activity的运行 显示在状态栏或通知的窗体中,可以有一些警告的设置,如播放声音、闪光灯 应包含图片、标题消息(自定义通知可不用)、最后用一个PendingInten...
  • u011731233
  • u011731233
  • 2015年01月31日 21:32
  • 1284

Android6.0 Bitmap存储以及Parcel传输源码分析

如果想要对Android Bitmap进行更多的操作,理解好Bitmap的实现将会有非常大的帮助,另外Android在6.0中增加了asm存储图片。这篇文章就通过源码来分析Android6.0中的Bi...
  • xxx_zhi
  • xxx_zhi
  • 2016年05月24日 14:55
  • 6370

Android BitTube进程间数据传递

Android 4.0里面除了个BitTube的东西,字面意思理解就是字节管道,可以用来在进程间进行数据的传递,但是是单向的 如果要在两个进程间使用BitTube进行数据的传递,一般都是这么使用的(...
  • new_abc
  • new_abc
  • 2013年05月24日 21:47
  • 5735

Bitmap为什么要调用recycle()方法来显示释放内存

Bitmap没有及时释放的话经常会出现OOM错误,这是由于Bitmap占用的是底层C的内存,JVM的垃圾回收机制对他没有用。用完后必须显示的调用 recycle()方法告诉JVM该Bitmap没有用了...
  • yzpbright
  • yzpbright
  • 2016年11月28日 21:45
  • 683

Parcel_进程间数据传递

Parcel,即打包。为什么需要打包呢?是为了序列化。 如果要在进程之间传递一个整数,很简单,直接传就行了;如果要传一个字符串,就稍微复杂了点:需先分配一块可以容纳字符串的内存,然后将字符串复制到内...
  • dipperkun
  • dipperkun
  • 2013年05月11日 20:57
  • 2483

继webpack之后的又一打包神器parcel

序言: 在继grunt、gulp实现自动化构建之后,webpack又引领前端打包潮流,众所周知的是,vue-cli的脚手架就是 基于webpack进行项目打包的。而webpack还在上升的势头的时候,...
  • weixin_39654784
  • weixin_39654784
  • 2017年12月13日 14:23
  • 496

Android进程间通信(一):使用Parcel对象完成进程间通信

Parcel类官方定义:Container for a message (data and object references) that can be sent through an IBinder...
  • happy_horse
  • happy_horse
  • 2016年06月22日 12:50
  • 1376

全新打包工具parcel零配置vuejs开发脚手架

全新打包工具parcel零配置vue开发脚手架 parcel-vue 一个基于parcel打包工具的 vue开发脚手架解决方案,强烈建议使用node8.0以上 项目地址(求star^_...
  • qq_25058625
  • qq_25058625
  • 2018年01月09日 18:51
  • 75

Android双缓冲绘图 Bitmap和Canvas 一看就懂

双缓冲绘图 Bitmap和Canvas 双缓冲是一种在内存中保留屏幕的副本或缓存的技术,先将所有图形都加载在内存中,然后一起绘制到屏幕上,避免了直接在屏幕上绘图时出现的明显闪烁。 实现步骤如下 ...
  • zhuifengshenku
  • zhuifengshenku
  • 2014年02月09日 14:27
  • 3196

创建自定义鼠标形状

鼠标状态及对应的鼠标形状: #define CURSOR_STATE_COUNT 7 enum CursorState{ cursorNormal = 0, cursorBeginSel, c...
  • xuweilmy
  • xuweilmy
  • 2014年02月17日 10:22
  • 417
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:notification复用中抛出can not parcel recyle’s bitmap
举报原因:
原因补充:

(最多只允许输入30个字)