TextView.setText не работает из-за многопоточности? - PullRequest
0 голосов
/ 30 мая 2018

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

Здесь я вызываю метод run.

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, поэтому проблема не возникает.

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

РЕДАКТИРОВАТЬ: Добавленный обработчик не компилируется.пожалуйста помоги.новый обработчик (). post (новый 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

                            }
                        });

        }


    });

1 Ответ

0 голосов
/ 30 мая 2018

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

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

}

});

...