Поток пользовательского интерфейса застревает, даже несмотря на то, что я работаю над другим

#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. Я такой идиот! Вот что происходит, когда вы работаете над кодом, когда устали. Спасибо!