在widget里更新图片的一些经验
WIDGET的更新要通过REMOTEVIEW
而且对于图片设置的函数是少之又少
从SDK里发现设置的方法有三个(views = remoteview)
views.setImageViewResource(viewId, srcId);
views.setImageViewBitmap(viewId, bitmap);
views.setImageViewUri(viewId, uri);
首先第一个:
setImageViewResource
缺点是只能放RES里的图片,但是使用起来最方便,只要指定就行了,问题是我在WIDGET里的图片是即时生成的
所以这个方法FAILED。
第二个:
setImageViewBitmap
我第一个选择的函数,可以将一张BITMAP放进去,看着挺不错的,因为URI用的少也不太懂
但是我用这个函数的时候出现了 !!!failed binder transaction!!!,经百度发现这个方法是通过INTENT传输数据,
BITMAP的数据会转换成数组数据,所以是有大小限制的,当大小超过限制的时候会出现以上的错误,并停止之后的操作
有一个解决方法是生成的BITMAP用ARGB4444来保存,这样可以使每个颜色所用的存储空间减少
但是这个方法会减少颜色的丰富度,而且也是个治标不治本的方法
第三个:
setImageViewUri
用法类似
ImageView.setImageUri(Uri.parse(new File("/sdcard/cats.jpg").toString()));
Uri其实是类似于URL的一种东西,我是用得很少,我的理解就是给这个IMAGEVIEW一个地址,然后让他自己去找
所以对于图片的大小是没有限制的,不过会出现一个问题,你会发现第二次刷新的时候图片并没有变化
因为URI是有缓存的,当你的字符串没有变化的时候,你每次调用的就是缓存,图片就不会更新
这里借用下一个STACKOVERFLOW里的解决办法。。具体地址我忘记存了。。。
views.setImageViewUri(R.id.widget_iv, Uri.parse(""));
在刷新图片前丢一个空白进去,这样缓存就会被刷新,虽然LOGCAT非常不好看。。。但是不失为一个实用的办法
设置完后第一次图片是有的,但是我再刷一次图片时出现
Resolve uri failed on bad Bitmap uri: ...
我就纳闷了,怎么出错呢,百度了很久,也没找出答案,我自己丢了一张图进项目里也没问题,就我这张动态生成的图有问题
在我感觉无解的时候我试着把这张图从虚拟机里PULL出来,尝试打开看看是不是图坏了,缺意外的发现图片被占用
按理说就算在虚拟机里占用了拿出来也不应该占用吧,有大神解释下么。。。
但是我也察觉到可能是因为在软件内部有占用,于是我搜索了我整个项目,把所有涉及到IO的代码都好好检查了一边,该关闭的都关闭,
可惜最后还是这样,我只能出点坏招了,就是在用图片的时候先复制一份,这样就能确保我的图片都是只有我一个人再用
new File("/data/data/com.rockman/files/bg.png").renameTo(new File("/data/data/com.rockman/files/bgaaaaaaaaaaa.png")); views.setImageViewUri(R.id.widget_iv, Uri.fromFile(new File("/data/data/com.rockman/files/bgaaaaaaaaaaa.png")));
这么弄一弄之后再怎么刷图片都是最新的了,记住rename是改名,记得再把这图片补一份哦