我对android文档的阅读发现了方法forceLayout()(用于在下一个布局请求时生成布局显示)和requestLayout()(应该立即发布布局请求),但我无法让它们表现出来正如广告所言。特别是,如果我在 Thread.Sleep 之前设置一组文本,然后在 Thread.Sleep 之后设置一组文本,则它会等待 Sleep 完成,然后再一次设置这两个文本,无论我是否在其间调用 forceLayout() 和 requestLayout() 。请不要回复很多关于我不应该在 UI 线程中调用 Thread.Sleep 的废话。如果我将 Thread.Sleep 包装在 CountDownTimer 中,它就可以很好地工作(只要我的滴答时间足够短,不会干扰睡眠时间,并且计时器的持续时间足够长,以允许睡眠完成。以下是一个例子:
int i=0;
TextView tv2;
TextView tv1;
LinearLayout ll;
Button bt;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ll=new LinearLayout(this);
ll.setOrientation(LinearLayout.VERTICAL);
tv1=new TextView(this);
tv2=new TextView(this);
bt=new Button(this);
bt.setText("Press to start");
ll.addView(bt);
ll.addView(tv1);
ll.addView(tv2);
tv2.setText("");
setContentView(ll);
bt.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
tv1.setText("starting sleep");
new CountDownTimer(6000,50){
public void onTick(long msuf)
{if(i==1)
{
try{
Thread.sleep(4000);
tv2.setText("waking up");
}
catch(InterruptedException e){};
}
i++;
}
public void onFinish(){}}.start();
}
});
}
[关于打电话的废话很多sleep()
在 UI 线程中]。如果我理解正确的话,你的意思是有类似的东西:
//...inside onTick()
try {
tv2.setText("almost waking up"); // first setText()
Thread.sleep(4000);
tv2.setText("waking up"); // second seText()
}
如果你让主线程休眠,它就会停止处理任何东西:当前方法、线程循环和消息队列。一旦再次唤醒,它将完成执行该方法,并执行第二个setText()
覆盖第一个文本,然后让线程循环继续并刷新 UI,仅显示第二个文本。
Not requestLayout()
nor forceLayout()
实际上可以使UI立即刷新,它们都会schedule线程循环中的布局请求。我不确定,但我认为它们之间的区别在于requestLayout()
由已更改其大小/位置的视图调用在其父级中, and forceLayout()
被称为ViewGroup
需要它的孩子重新布局。
所以【废话多了,打电话sleep()
在 UI 线程中]。对于这样的事情打电话postDelayed()
如果您不想搞乱多线程,那么在主线程处理程序上可能是最好的解决方案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)