6

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

        }
4

1 回答 1

11

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

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

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

不是requestLayout()forceLayout()不能真正使 UI 立即刷新,它们都会在线程循环中安排布局请求。我不确定,但我认为它们之间的区别在于由改变其在其 parent 中requestLayout()大小/位置的视图调用,并由需要重新布置其子级的 a 调用。forceLayout()ViewGroup

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

于 2011-03-25T09:45:59.783 回答