Почему основной поток заблокирован

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

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

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

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

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

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

1 ответ

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

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

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

Другие вопросы по тегам