Android UI更新中 ImageView使用setBackgroundResource多次更新图片失效

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android UI更新中 ImageView使用setBackgroundResource多次更新图片失效相关的知识,希望对你有一定的参考价值。

我的程序中包含多个Activity,要更新的是一个子界面,从主界面按键进入,第一次进入后可以正常的根据数据库更新图片,多次更改数据都可以更新,但是退出这个Activity后重新进入就有时候会无法更新了,有时候要发了几条指令修改数据库他才会更新。求教啊。。。

参考技术A 有缓存,要把缓存删掉,或者把图片名称换了,重新把图片下载下来追问

如果是缓存的原因的话怎么样在程序里清?我不是在下载程序的时候图片没变,而是程序执行过程中需要更改图片。

追答

context.getCacheDir()大概是这个方法吧,获得缓存地址

追问

有没有什么可以参考的东西~得到地址后直接删了吗、还是有什么其他操作
而且这个获得的地址好像不止是图片的缓存,应该不能删了吧

参考技术B 在 onResume 里获取服务器数据追问

这个具体怎么弄啊?每次打开这个子界面我都是用自己写的方法动态加载控件的,然后另写一个线程用来更新界面,就是在更新的时候第一次正常,退出重进就无法更新了

追答

Activity的前台生命周期自onResume()调用起,至相应的onPause()调用为止。在此期间,Activity位于前台最上面并与用户进行交互。Activity会经常在暂停和恢复之间进行状态转换——例如当设备转入休眠状态或者有新的Activity启动时,将调用onPause() 方法。当Activity获得结果或者接收到新的Intent时会调用onResume() 方法。
也就是说你第一次进入这个Activity时会进入onCreate.进入你更新下载图片的方法,,当你退出时Activity进入onPause(),重新进入后 Activity是进入onResume(),而不进入onCreate,你的更新图片当然没有效果了。。所以你需要在onResume()里获取图片更新。。。。

就是在onResume()里调用你的获取服务器数据方法然后调用你的timeTask();

追问

我的TimeTask是在onResume里调用的,而且我在写退出的时候是调用finish方法,应该不会出现你说的那种情况吧,而且有一点很奇怪,第二次进入的时候不是完全不能更新图片,而是有时候能有时候不能

追答

activity在后台时当内存不够时。是有可能会被销毁的。这样就会重新onCreate。既然你的背景更新实在timetask里,,建议你用handler 来更新主线程activity

追问

我现在用了handler来更新UI了,不过还是一样的效果,第二次进入的时候不能正常更新,有时候改一次数据库就可以,有时候要改N次才会更新图片,但是我在调试信息里看了,明明确确的有执行
setBackgroundResource这个方法,我想问一下短时间内多次执行这个方法会不会有什么bug,我现在每次更新的时候都会调用这个很多次,会不会是这里有问题?

追答

不清楚你的业务逻辑是什么。。为什么要根据数据库中image的个数来循环。。显然UI是正常更新的。。因为这个循环更新成原来的图片了。。所以显得没跟新

追问

追答

试试setBackgroundDrawable(getResources().getDrawable(R.id. ))

追问

这个我之前有试过了,也不行,刚刚还试了一个很极品的方法,更新的时候把layout中的views都删了,然后全部重新写入,效果比之前稍微好了一点,不会一直不更新,但还是没有解决这个现象,还是会出现一些不更新。。哎~快疯了。我发私信。。

本回答被提问者采纳
参考技术C 你那是 更换背景,不是更换图片,用背景也可以。实在早不到原因debug追问

imageview.setBackgroundResource可以更改控件的背景,事实好像也是可以的,只是我不知道为什么我退到主界面在进入就没用了,DEBUG的话一直都在用,事实上也有执行到该语句,但就是不生效

追答

这样写
Handler handler = new Handler()
@Override
public void handleMessage(Message msg)
// 处理ui
super.handleMessage(msg);

;

boolean b=true;
new Thread(new Runnable()

@Override
public void run()
while (b)

handler.sendEmptyMessage(0X123);




);

追问

这个只是写个handler来更新而已,而且我已经使用过了~效果跟原来那个一样~

以上是关于Android UI更新中 ImageView使用setBackgroundResource多次更新图片失效的主要内容,如果未能解决你的问题,请参考以下文章

使用 UI-Thread 更新 ImageView 的位图

Android UI 之 ImageView

在android中经常更新ImageView

Android UI系列-----ImageView的scaleType属性

Android UI - 用于水平绘制多个ImageView的布局

Android基础到进阶UI ImageView及其子类 介绍+实例