我正在研究android中的应用程序。我正在尝试从后台线程更新数据到UI。但是,由于某些原因它不起作用。任何人都可以纠正错误或建议任何更好的解决方案吗?我使用Thread从蓝牙套接字读取数据并使用RunOntheUI更新UI。这是代码:
socket = belt.createRfcommSocketToServiceRecord(UUID_SECURE);
socket.connect();
stream = socket.getInputStream();
// final int intch;
Thread timer2 = new Thread() { // Threads - do multiple things
public void run() {
try {
// read data from input stream if the end has not been reached
while ((intch = stream.read()) != -1) {
byte ch = (byte) intch;
b1.append(ByteToHexString(ch) +"/");
decoder.Decode(b1.toString());
runOnUiThread(new Runnable() {
public void run()
{
// update the uI
hRMonitor.SetHeartRateValue((int) decoder.GetHeartRate());
}
});
Thread.sleep(1000);
}
} catch (Exception e) {
e.printStackTrace();
}
}};
timer2.start();
答案 0 :(得分:1)
使用
Your_Current_Activity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
hRMonitor.SetHeartRateValue((int) decoder.GetHeartRate());
}
});
而不是
runOnUiThread(new Runnable() {
public void run()
{
// update the uI
hRMonitor.SetHeartRateValue((int) decoder.GetHeartRate());
}
});
答案 1 :(得分:0)
没有。你绝不能这样做。永远不要使用另一个线程来更新UI线程,因为UI线程不是thread-safe
,这意味着:当您更新UI线程时,UI线程不会停止工作,因为你做了一些事情。
Android对这项工作有一定的机制。这是Asyntask
:它将创建另一个线程,并在需要时,它将有安全的方式来更新UI线程。如果您想了解更多细节,Asyntask会将消息删除到UI Thread的消息队列。
这是我关于不同Thread,Handler和Asyntask的帖子的另一个链接。 Asyntask
希望这有帮助:)