Android 使用uithread更改TextView值
我正在尝试更改一些textview值,但当它没有出现在屏幕上时,该值不会更改,或者当它出现在屏幕上时,该值会更改,当向下滚动和向上滚动时,该值会返回到旧值。我尝试了以下两种方法,但均无效:Android 使用uithread更改TextView值,android,textview,ui-thread,Android,Textview,Ui Thread,我正在尝试更改一些textview值,但当它没有出现在屏幕上时,该值不会更改,或者当它出现在屏幕上时,该值会更改,当向下滚动和向上滚动时,该值会返回到旧值。我尝试了以下两种方法,但均无效: final Timer timer=new Timer(); timer.schedule(new TimerTask() { @Override public void run() { MainActivity.this.runOnUiThread(new Runnable(
final Timer timer=new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
myTextView.setText("sometext");
timer.cancel();
}
});
}
}, 5000, 1000);
以及:
试用
您还可以查看并在PostExecute中将文本设置为TextView。您必须确保在更改TextView的值之前先绘制UI,这可以通过添加布局侦听器来完成
ViewTreeObserver vto = getWindow().getDecorView().getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Overrid
public void onGlobalLayout() {
final Timer timer=new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
myTextView.setText("sometext");
timer.cancel();
}
});
}
}, 5000, 1000);
}
}
尝试删除timer.cancel,因为它会强制计时器只执行一次。这会占用大量内存,并导致主线程上的工作过多,我的问题是在id生成后更新文本视图。您尝试过我的答案了吗?解决了还是更新了我的答案?你必须将一个问题标记为正确的全局YouTube Listener一直称之为self,而这不是我想要的,我需要一次性更改所有文本视图,即使是未显示的文本视图,因为CPU使用情况!?!?!?!?!?!?您的答案很好,但它会让CPU做太多的工作:只有在绘制布局时才会调用OnGlobalYoutListener,它是如何一次又一次地调用自己的?所以您的意思是,它对CPU来说太难了,所以它对您起作用?
private void TestThread() {
Handler handler = new Handler();
Runnable runnable = new Runnable() {
public void run() {
handler.post(new Runnable(){
public void run() {
tvTime.setText("SomeText");
}
});
}
}
};
new Thread(runnable).start();
}
ViewTreeObserver vto = getWindow().getDecorView().getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Overrid
public void onGlobalLayout() {
final Timer timer=new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
myTextView.setText("sometext");
timer.cancel();
}
});
}
}, 5000, 1000);
}
}