ViewTreeObserver侦听器在一段时间后未被调用
问题描述:
使用ViewTreeObserver时遇到很大困难。所有的作品在一段不可预测的时间内都可以正常工作,然后听众就不再操作了。这是肯定是因为什么被写在doc:返回ViewTreeObserver观察者不保证有效期为这一观点的寿命 因此我重新安装每次我改变我的观点:ViewTreeObserver侦听器在一段时间后未被调用
protected void shrinkToFit(final TextView t) {
if(vto==null||!vto.isAlive()){
vto = t.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
public void onGlobalLayout() {
doAdjust(t);
}
});
}
}
这里是我如何调用它:
TextView t = (TextView) findViewById(R.id.maindesc);
t.setTextSize(Constants.MAINDESC_SIZE);
String todisp_1 = tarifreadtemp.area_desc + ":"
+ tarifreadtemp.area_tarifuserdesc;
shrinkToFit(t);
t.setText(todisp_1);
t.invalidate();
答
通常我的addOnGlobalLayoutListener
监听器添加到我的观点之前的布局被重新绘制或改变(当我第一次初始化的观点或这可能发生,也许改变其布局前)和听者的第一件事我所做的是从视图中移除侦听器。
答
我遇到了类似的问题,有时onGlobalLayout没有被调用。发生这种情况,有时在旋转设备时重绘列表视图。
我的解决方案
我对这个问题的解决方案如下:我注意到,无论怎样,onScroll听众每次被称为列表视图是重绘。所以,当我注册onGlobalLayout监听器时,我设置了一个全局标志,并将所有代码从监听器移到一个单独的函数中。
如果侦听器被调用,我调用该函数并重置该标志。
否则,每次onScroll被调用时,我检查了标志的状态,如果它仍然是true,那么我调用该函数并重置标志。
这种方法意味着每次更改视图时都会将侦听器添加到视图中。可以这样做,但为什么Android的行为呢?这对于我所知道的任何其他观察者/听众都不会发生。 – michaelsmith 2012-02-24 10:10:15
这是一个很好的问题..不幸的是,我没有回答这个问题 – Cata 2012-02-24 11:41:24
我只是意识到系统正在正确处理,尽管延迟了几分钟......可能只是在调试模式下的情况。将检查这一点 – michaelsmith 2012-02-25 10:41:14