Поток Android внезапно останавливается

В моем приложении для Android есть поток, который выполняет тяжелую работу, а затем обновляет пользовательский интерфейс с помощью обработчика. Однако через некоторое время после запуска поток внезапно остановится без каких-либо сигналов или исключений. Я понятия не имею, как это происходит. Это проблема параллелизма при доступе к одной и той же переменной моим собственным потоком и потоком пользовательского интерфейса? Ниже приведен код потока и обработчика.

TextView textViewFromActivity;
String valueFromThread;

public void startThread() {
    thread.start();
}

public Handler handler = new Handler() {
    public void handleMessage(android.os.Message msg) {
        if(valueFromThread != null && valueFromThread != "") {
            textViewFromActivity.setText(valueFromThread);
        }
    }
}

public Thread thread = new Thread() {
    public void run() {
        while(true) {
            doHeavyWorkAndUpdateValueFromThread();
            handler.sendEmptyMessage(0);
        }
    }
}

Обновление:

Следующие строки отображаются в Logcat, когда текстовое представление перестает обновляться.

Логкат:

09-20 12:38:32.379: I/Choreographer(32250): Skipped 30 frames!  The application may be doing too much work on its main thread.
09-20 12:38:33.441: I/Choreographer(32250): Skipped 32 frames!  The  application may be doing too much work on its main thread.
09-20 12:38:34.006: I/Choreographer(32250): Skipped 33 frames!  The application may be doing too much work on its main thread.
09-20 12:38:34.640: I/Choreographer(32250): Skipped 36 frames!  The application may be doing too much work on its main thread.
09-20 12:38:40.496: I/art(32250): WaitForGcToComplete blocked for 21.575ms for cause HeapTrim
09-20 12:38:58.146: I/art(32250): Background sticky concurrent mark sweep GC freed 132986(4MB) AllocSpace objects, 0(0B) LOS objects, 16% free, 16MB/19MB, paused 8.544ms total 42.510ms
09-20 12:39:10.765: I/art(32250): WaitForGcToComplete blocked for 8.361ms for cause HeapTrim
09-20 12:39:14.306: I/art(32250): Background sticky concurrent mark sweep GC freed 125390(3MB) AllocSpace objects, 0(0B) LOS objects, 17% free, 15MB/19MB, paused 5.645ms total 41.015ms

person Code Eater    schedule 20.09.2015    source источник
comment
пожалуйста, опубликуйте какой-нибудь logcat.   -  person Mohammad Tauqir    schedule 20.09.2015
comment
Опубликовано. Приведенные выше строки отображаются, когда текстовое представление перестает обновляться.   -  person Code Eater    schedule 20.09.2015
comment
Вы инициализировали textViewFromActivity с помощью findviewbyid   -  person Mohammad Tauqir    schedule 20.09.2015
comment
да. Текстовое представление может быть обновлено изначально. Через несколько секунд только текстовое представление перестает отвечать.   -  person Code Eater    schedule 20.09.2015


Ответы (2)


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

  • если ваше приложение претерпевает изменение ориентации, возможно, ваш поток теперь ссылается на несуществующий обработчик
  • возможно ли, что doHeavyWorkAndUpdateValueFromThread() еще не завершено?
person homerman    schedule 20.09.2015

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

И вот мой общий ответ:

Используйте отладчик. Я знаю, что поначалу это незнакомо, но научиться пользоваться им поэтому того стоит.

В этом случае вы сможете увидеть, жив ли еще ваш поток (добавьте хорошее имя в конструктор вашего потока (например, new Thread("heavy work thread"), чтобы помочь найти правильный), а также стек вызовов для его текущего выполнения.

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

person Snild Dolkow    schedule 20.09.2015