TextView.setText не работает из-за потоковой передачи?

Я запускаю поток, который получает строку данных от устройства несколько раз в секунду. Я пытаюсь обновить TextView для отображения этих данных, однако, как только я запускаю поток в connector.run(), я не могу установить текст TextView. Даже когда я запускал setText() над методом запуска, он не работал, пока я не закомментировал вызов метода запуска.

Здесь я вызываю метод запуска.

readWeight.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    //inputWindow.setText("helloooooooo worldddddd");
                    connector.run();
                    setInputWindow();
                   //readWeight.setVisibility(View.INVISIBLE);
                }
            });

Вот мой метод запуска в другом классе.

public void run() {
            // Keep listening to the InputStream while connected
            while (true) {

                try {
                    output = "";
                    //read the data from socket stream
                    if (mmInStream != null) {
                        mmInStream.read(buffer);
                      for(byte b : buffer)
                      {
                          char c = (char) b;
                          if (c >=' ' && c <'z') {
                           // System.out.print(c);
                            output += c;
                          }

                      }
                       System.out.println();
                        Intent intent = new Intent();
                        intent.setAction("com.curie.WEIGHT_RECEIVED");
                        intent.putExtra("Output",output);
                        LocalBroadcastManager.getInstance(InputActivity.getContext()).sendBroadcastSync(intent);

                        // LocalBroadcastManager.getInstance(InputActivity.getContext()).sendBroadcast(intent);

                    }
                    // Send the obtained bytes to the UI Activity
                } catch (IOException e) {
                    //an exception here marks connection loss
                    //send message to UI Activity
                    break;
                }
            }
        }

Я получаю данные правильно, когда проверяю строку, полученную BroadcastReceiver, так что проблема не в этом.

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

Обновлено: добавленный обработчик не компилируется. пожалуйста помоги. new Handler (). post (new Runnable () {

        @Override
        public void run() {
            // Always cancel discovery because it will slow down a connection
            //Log.d("workkkkkk","$$$$$$$$$$$$$$$$****** printingggggg ******$$$$$$$$$$$$$$$$");
            while (true) {
                //counter++;

                try {
                    output = "";
                    //read the data from socket stream
                    //mmInStream != null && counter%10000000 == 1
                    if (mmInStream != null) {
                        mmInStream.read(buffer);
                        for(byte b : buffer)
                        {
                            char c = (char) b;
                            if (c >=' ' && c <'z') {
                                // System.out.print(c);
                                output += c;
                            }

                        }
                        System.out.println();
                        Intent intent = new Intent();
                        intent.setAction("com.curie.WEIGHT_RECEIVED");
                        intent.putExtra("Output",output);
                        LocalBroadcastManager.getInstance(inputContext).sendBroadcastSync(intent);

                        // LocalBroadcastManager.getInstance(InputActivity.getContext()).sendBroadcast(intent);

                    }
                    // Send the obtained bytes to the UI Activity
                } catch (IOException e) {
                    //an exception here marks connection loss
                    //send message to UI Activity
                    break;
                }
            }
 inputContext.runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                // here do the UI chnages
                                //  you can set text in textview Here

                            }
                        });

        }


    });

какой метод setInputWindow() делать?

Sunny 30.05.2018 14:44

Он просто вызывает `inputWindow.setText (weight);` Я использовал его, чтобы попытаться добавить задержки, чтобы посмотреть, поможет ли это.

Collin Urie 30.05.2018 14:47

Итак, inputWindow.setText(weight); после того, как inputWindow.setText("helloooooooo worldddddd" заменит его на weight, можете ли вы сказать, каково значение wight?

Sunny 30.05.2018 14:50

Я могу сказать, каково значение веса, когда я печатаю его на консоли, но оно не отображается, когда я вызываю setText(), но даже inputWindow.setText("helloooooooo worldddddd") не будет работать, если я не закомментирую connector.run()

Collin Urie 30.05.2018 14:54

вам нужно запустить свой метод run в рабочем потоке.

Sunny 30.05.2018 15:00
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
5
687
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для фоновой работы используйте обработчик (используйте этот код)

 new Handler().post(new Runnable() {
            @Override
            public void run() {
                // here do the background task

            }
        });

и если вы хотите обновить пользовательский интерфейс, используйте runOnUiThread ()

              if u want  to update ui Just do this
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        // here do the UI chnages
                    }
                });

Надеюсь, что это поможет вам.

Сделай это так

  @Override
public void run() {
    // Always cancel discovery because it will slow down a connection
    //Log.d("workkkkkk","$$$$$$$$$$$$$$$$****** printingggggg ******$$$$$$$$$$$$$$$$");
    while (true) {
        //counter++;

        try {
            output = "";
            //read the data from socket stream
            //mmInStream != null && counter%10000000 == 1
            if (mmInStream != null) {
                mmInStream.read(buffer);
                for(byte b : buffer)
                {
                    char c = (char) b;
                    if (c >=' ' && c <'z') {
                        // System.out.print(c);
                        output += c;
                    }

                }
               // context == activity context
               context.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        // here do the UI chnages
                      //  you can set text in textview Here
                    }
                });


            }
            // Send the obtained bytes to the UI Activity
        } catch (IOException e) {
            //an exception here marks connection loss
            //send message to UI Activity
            break;
        }
    }

}

});

войдут ли оба этих метода в мой класс без пользовательского интерфейса? как мне указать, над каким действием действовать?

Collin Urie 30.05.2018 15:19

Просто передайте контекст Activity в свой класс без пользовательского интерфейса через конструктор. С помощью Context вы можете получить эти методы и выполнять свою работу.

Piyush 30.05.2018 15:22

Не лучше ли использовать AsyncTask, если он автоматически управляет как фоновым потоком, так и взаимодействием с основным (UI) потоком?

Eselfar 30.05.2018 15:33

Да, вы можете использовать Async Task в зависимости от требований.

Piyush 30.05.2018 15:38

куда мне положить runOnUiThread? я изо всех сил пытаюсь реализовать это.

Collin Urie 30.05.2018 15:40

Я опубликовал, как выглядит мой обработчик, он все еще не компилируется, что я делаю не так?

Collin Urie 30.05.2018 16:44

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