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,进行清空.

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

相关文章推荐

使用 TotalOrderPartitioner 时,抛出异常:File _partition.lst does not exist

情景:

[J2SE]s02e05.抛出错误(课后练习)

错误逐层往上抛出 Throw try,catch,finally   sum+=,Integer.parseint() Class.forName() 用法 例子:两字符串转换为整数后求和;Class...

Android4.0 Bitmap Parcel传输源码分析

很久之前就看到有网友遇到用Parcel传Bitmap的时候,会遇到因为图片太大而报错,都在讨论传输Bitmap的时候的大小限制,但是实际上应该只有在4.0之前会有限制,4.0之后图片传输采用了Blob...

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

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

解决Could not read input channel file descriptors from parcel

解决Could not read input channel file descriptors from parcel.个人在开发过程中遇到此bug,查找了一些资料,网友们说可以从以下几个方面,检查自...

Android Bitmap inBitmap 图片复用

原文链接:Android Bitmap inBitmap 图片复用? 主要就是指的复用内存块,不需要在重新给这个bitmap申请一块新的内存,避免了一次内存的分配和回收,从而改善了运行效...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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