Я запускаю поток, который получает строку данных от устройства несколько раз в секунду. Я пытаюсь обновить 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
}
});
}
});
Он просто вызывает `inputWindow.setText (weight);` Я использовал его, чтобы попытаться добавить задержки, чтобы посмотреть, поможет ли это.
Итак, inputWindow.setText(weight); после того, как inputWindow.setText("helloooooooo worldddddd" заменит его на weight, можете ли вы сказать, каково значение wight?
Я могу сказать, каково значение веса, когда я печатаю его на консоли, но оно не отображается, когда я вызываю setText(), но даже inputWindow.setText("helloooooooo worldddddd") не будет работать, если я не закомментирую connector.run()
вам нужно запустить свой метод run в рабочем потоке.




Для фоновой работы используйте обработчик (используйте этот код)
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;
}
}
}
});
войдут ли оба этих метода в мой класс без пользовательского интерфейса? как мне указать, над каким действием действовать?
Просто передайте контекст Activity в свой класс без пользовательского интерфейса через конструктор. С помощью Context вы можете получить эти методы и выполнять свою работу.
Не лучше ли использовать AsyncTask, если он автоматически управляет как фоновым потоком, так и взаимодействием с основным (UI) потоком?
Да, вы можете использовать Async Task в зависимости от требований.
куда мне положить runOnUiThread? я изо всех сил пытаюсь реализовать это.
Я опубликовал, как выглядит мой обработчик, он все еще не компилируется, что я делаю не так?
какой метод
setInputWindow()делать?