0

Может кто-нибудь скажет мне, почему приведенный ниже код блокирует основной поток?Зачем нужна основная затмение

методы loadFile запускает рабочий поток, который загружает огромный файл журнала, который может занять 10 секунд. И когда я запускаю программу, кнопка, ответственная за запуск файлового потока, зависает, пока файл не будет загружен, и нить файла завершит свою работу.

Кроме того, в трех строках следуйте вызову метода loadFile, я пытаюсь отобразить что-то вроде «loading ....», и пока файл не загружен или его поток еще не завершил работу, i отобразите тот же текст «Загрузка .....» с дополнительной точкой до тех пор, пока поток файлов/рабочий поток не завершится.

Пожалуйста, сообщите мне, почему приведенный ниже код блокирует основной поток, и как добиться отображения текста информирует пользователя о том, что файл по-прежнему загружается с дополнительной точкой в ​​конец текста.

Надеюсь, мой вопрос ясен.

if ((this.client != null) && (this.client.isConnected())) { 
      System.out.println("Client is connected to a broker."); 
      statusarea.append(Log.w(TAG, "preLoadSystemChecks", "Client Connected") + "\n"); 
      loadFile(); 
      StringBuilder sb = new StringBuilder("."); 
      statusarea.append(Log.i(TAG, "preLoadSystemChecks", "Loading measurements file.") + "\n"); 
      statusarea.append(Log.i(TAG, "preLoadSystemChecks", "Loading" + sb) + "\n"); 
      while ((this.fileThread != null) && (this.fileThread.getState() != State.TERMINATED)) { 
       sb.append("."); 
      } 

LoadFile():

protected void loadFile() throws MqttException { 
    // TODO Auto-generated method stub 
    statusarea.append(Log.d(TAG, "loadFile", "File is loaded") + "\n"); 
    if (this.fileThread == null) { 
     fileThread = new Thread(fileProcessinRunnable, FILE_THREAD); 
     fileThread.start(); 
    } 
} 
+0

@NPE, пожалуйста, см. Требуемый метод публикации – rmaik

ответ

2

Ваш while цикл блокирует основной поток, пока загрузчик поток не заканчивается:

while ((this.fileThread != null) && (this.fileThread.getState() != State.TERMINATED)) { 
    sb.append("."); 
} 

(Обратите внимание, что просто добавив точку к StringBuilder не приведет к отображению чего-либо в любом месте.)

+0

есть ли способ сделать это, не блокируя основной поток? – rmaik

+0

@ rmaik: Не запускайте цикл ожидания? – NPE

+0

Извините, я не получил вашу точку – rmaik

Смежные вопросы