Реализация цикла while в Android - PullRequest
       18

Реализация цикла while в Android

11 голосов
/ 20 сентября 2011

Я не могу понять реализацию цикла while в Android.

Всякий раз, когда я реализую цикл while внутри пакета onCreate(), (код показан ниже)

public void onCreate(Bundle icicle) {       
  super.onCreate(icicle);
  setContentView(R.layout.main);
  TextView=(TextView)findViewById(R.id.TextView);
  while (testByte == 0)
      updateAuto(); 
}

ничего не загружается, и программа через некоторое время переходит в состояние «зависания», и я не могу понять, почему.Тестовый байт выглядит следующим образом:

byte testByte == 0;

и updateAuto() должен обновлять код за 1 секунду и отображаться внутри части textView.Я использовал setText внутри updateAuto (), как показано ниже, и все работает нормально, но как только я реализую цикл while, все, что я вижу, - это черный экран, а затем опция принудительного закрытия через несколько секунд из-за того, что он «не отвечает».

TextView.setText(updateWords);

Я изменил его на формат кнопки (то есть мне нужно нажать на кнопку, чтобы обновить ее сейчас), но я хочу, чтобы она обновлялась сама, а не нажимала ее вручную.

Я неправильно реализую цикл while?

Я также пытался вызвать цикл while в отдельной функции, но он все равно дает мне черный экран небытия.

Я что-то читал об услуге Handler ... что она делает?Может ли служба обработчика обновить мое TextView более безопасным или эффективным способом памяти?

Большое спасибо, если кто-нибудь даст несколько советов о том, что я должен сделать на этом.

1 Ответ

33 голосов
/ 20 сентября 2011

Готовьтесь.И постарайтесь внимательно следить, это будет бесценно как dev.

Хотя циклы действительно должны быть реализованы только в отдельном потоке.Отдельный поток похож на второй процесс, выполняющийся в вашем приложении.Причина его принудительного закрытия заключается в том, что вы запустили цикл в потоке пользовательского интерфейса, в результате чего пользовательский интерфейс не смог ничего сделать, кроме как пройти через этот цикл.Вы должны поместить этот цикл во второй поток, чтобы можно было свободно запускать поток пользовательского интерфейса.При работе с потоками вы не можете обновить графический интерфейс, если вы не в потоке пользовательского интерфейса.Вот как это будет сделано в этом случае.

Сначала вы создаете Runnable, который будет содержать код, который зацикливается в его методе run.В этом Runnable вам нужно будет создать второй Runnable, который будет публиковать сообщения в потоке пользовательского интерфейса.Например:

 TextView myTextView = (TextView) findViewById(R.id.myTextView); //grab your tv
 Runnable myRunnable = new Runnable() {
      @Override
      public void run() {
           while (testByte == 0) {
                Thread.sleep(1000); // Waits for 1 second (1000 milliseconds)
                String updateWords = updateAuto(); // make updateAuto() return a string
                myTextView.post(new Runnable() { 
                     @Override
                     public void run() {
                          myTextView.setText(updateWords);
                     });
           }
      }
 };

Затем просто создайте свой поток с помощью Runnable и запустите его.

 Thread myThread = new Thread(myRunnable);
 myThread.start();

Теперь вы должны увидеть, как ваше приложение зацикливается без принудительного закрытия.

...