gpt4 book ai didi

android - forceLayout(), requestLayout()

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:38:36 27 4
gpt4 key购买 nike

我阅读 android 文档找到方法 forceLayout()(在下一个布局请求时生成布局显示)和 requestLayout()(应该立即发布布局请求),但我无法获得他们按照宣传的方式行事。特别是,如果我在 Thread.Sleep 之前和之后设置一个文本,它会等待 Sleep 完成,然后再一次设置两个文本,无论我是否在两者之间调用 forceLayout() 和 requestLayout()。请不要用很多关于我不应该在 UI 线程中调用 Thread.Sleep 的废话来回应。如果我将 Thread.Sleep 包装在 CountDownTimer 中,它会很好地工作(只要我的滴答时间足够短以不干扰 sleep 时间,并且计时器的持续时间足够长以允许 sleep 完成。以下是一个例子:

    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();
}
});

}

最佳答案

[很多关于在 UI 线程中调用 sleep() 的废话]。如果我没听错,你的意思是有类似的东西:

//...inside onTick()
try {
tv2.setText("almost waking up"); // first setText()
Thread.sleep(4000);
tv2.setText("waking up"); // second seText()
}

如果你让你的主线程休眠,它会停止处理任何事情:当前方法、线程循环和消息队列。再次唤醒后,它将完成该方法的执行,第二个 setText() 覆盖第一个,然后让线程循环继续并进行 UI 刷新,仅显示第二个文本。

requestLayout()forceLayout() 实际上都不能使 UI 立即刷新,它们都会在线程中安排布局请求环形。我不确定,但我认为它们之间的区别在于 requestLayout() 由已更改其大小/位置的 View 调用在其父级中,并且 forceLayout() 由需要重新布局的 ViewGroup 调用。

因此[关于在 UI 线程中调用 sleep() 的更多废话]。对于这种情况,如果您不想弄乱多线程,那么在主线程处理程序上调用 postDelayed() 可能是最好的解决方案。

关于android - forceLayout(), requestLayout(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5428719/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com