forceLayout(),requestLayout()

pet*_*ieb 6 android thread-sleep

我对android文档的阅读发现方法forceLayout()(在下一个布局请求中产生布局显示)和requestLayout()(应该发布一个立即的布局请求),但是我无法让它们表现出来如宣传的那样.特别是,如果我在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();
              }         
      });

        }
Run Code Online (Sandbox Code Playgroud)

big*_*nes 11

[很多关于sleep()在UI线程中调用的废话].如果我做对了,你的意思是:

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

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

不是requestLayout()forceLayout()可以真正使UI刷新立即,他们都将安排在线程回路布局的要求.我不知道,但我认为它们之间的区别在于,requestLayout()是由已经改变它的大小/位置的图叫做其父,并forceLayout()称为一个ViewGroup需要它的孩子们重新布局.

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