forceLayout (), requestLayout () - PullRequest
       0

forceLayout (), requestLayout ()

6 голосов
/ 25 марта 2011

Мое чтение документации Android находит методы forceLayout () (который должен отображать макет при следующем запросе макета) и requestLayout () (который должен публиковать немедленный запрос макета), но я не могу получитьих вести себя как рекламируется.В частности, если я делаю один заданный текст перед Thread.Sleep и один после, он ожидает завершения Sleep перед тем, как задавать оба текста одновременно, независимо от того, вызову ли я ForceLayout () и requestLayout () между ними.Пожалуйста, не отвечайте с большой ерундой о том, что я не должен вызывать 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();
              }         
      });

        }

1 Ответ

11 голосов
/ 25 марта 2011

[много глупостей о вызове sleep() в потоке пользовательского интерфейса].Если я правильно понял, вы имеете в виду что-то вроде:

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

Если вы заставите ваш основной поток спать, он просто перестанет обрабатывать что-либо: текущий метод, цикл потока и очередь сообщений.После пробуждения он завершит выполнение метода со вторым setText(), переопределяющим первый, и затем продолжит цикл потока и обновит пользовательский интерфейс, показывая только второй текст.

Не requestLayout() * * * * * * forceLayout() не может на самом деле немедленно обновить пользовательский интерфейс, они оба планируют запрос макета в цикле потока.Я не уверен, но я думаю, что разница между ними заключается в том, что requestLayout() вызывается представлением, которое изменило свой размер / позицию в его родительском , а forceLayout() вызывается ViewGroup который нуждается в его дочерних элементах для перекомпоновки.

Поэтому [больше глупостей о вызове sleep() в потоке пользовательского интерфейса].Для таких вещей вызов postDelayed() в обработчике основного потока, вероятно, является лучшим решением, если вы не хотите связываться с многопоточностью.

...