#java #android #multithreading #ui-thread #countdownlatch
#java #Android #многопоточность #пользовательский интерфейс-поток #countdownlatch
Вопрос:
У меня есть этот код, который одним нажатием кнопки запускает службу из нового потока, и служба запускает мой TCP-клиент.
TCP-клиент после подключения отправит событие обратного отсчета, чтобы сообщить фрагменту о продолжении работы.
код выглядит следующим образом
connectButton = (Button) view.findViewById(R.id.connectBT);
connectButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new Thread(new Runnable() {
@Override
public void run() {
try {
// ***** IntentService Way ****** //
Intent intent = new Intent(getActivity(), NetworkService.class);
getActivity().startService(intent);
// Once client is connected, give the server some info about client
mCountDown.await(3000, TimeUnit.MILLISECONDS);
String json = jsonMaker.toJson(new DeviceInfo());
DispatchToServer(json);
} catch (Exception ie) {
ie.getMessage();
}
}
}).run();
но когда я нажимаю connect, мой пользовательский интерфейс по-прежнему зависает по какой-то причине, хотя я жду другого потока, а не потока пользовательского интерфейса. Тот же код работал нормально, когда я использовал AsyncTask вместо службы.
Ответ №1:
Вы написали
new Thread(new Runnable() {...}).run();
Thread#run
это просто Thread
реализация интерфейса класса Runnable
. Все, что он делает, это делегирует run
метод Runnable
, который вы передали конструктору.
Потоки Java запускаются с start
помощью метода:
new Thread(new Runnable() {...}).start();
Комментарии:
1. Спасибо, я знаю это, но по какой-то причине я отключился от этой очень важной детали. Чувствую себя тупицей
2. Это очень распространенная ошибка. Хороший способ избежать этого — просто не использовать необработанные потоки; вместо этого предпочитайте службу исполнителя.
Ответ №2:
Попробуйте вызвать thread.start() вместо thread.run()
Ответ №3:
Используйте Thread.start() вместо Thread.run()
Комментарии:
1. Я такой идиот! Вот что происходит, когда вы работаете над кодом, когда устали. Спасибо!