在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是改名,记得再把这图片补一份哦

 

 

 

posted @ 2012-12-23 15:41  rockman12352  阅读(1454)  评论(0编辑  收藏  举报