android中的线程问题

时间:2012-07-03 20:36:55

标签: java android

我正在研究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();

2 个答案:

答案 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

希望这有帮助:)