无法理解蓝牙输入和输出android

时间:2014-09-25 06:31:53

标签: android bluetooth

以下代码取自here

有人可以深入解释这是如何运作的吗?

这个处理程序是什么,它做了什么?

如何实施while条件?。

循环如何进行?

我非常粗略地了解代码是如何工作的,如果你可以帮助我,那将非常有益于我。谢谢。

{
    final Handler handler = new Handler(); 
    final byte delimiter = 10; //This is the ASCII code for a newline character

    stopWorker = false;
    readBufferPosition = 0;
    readBuffer = new byte[1024];
    workerThread = new Thread(new Runnable()
    {
        public void run()
        {                
           while(!Thread.currentThread().isInterrupted() && !stopWorker)
           {
                try 
                {
                    int bytesAvailable = mmInputStream.available();                        
                    if(bytesAvailable > 0)
                    {
                        byte[] packetBytes = new byte[bytesAvailable];
                        mmInputStream.read(packetBytes);
                        for(int i=0;i<bytesAvailable;i++)
                        {
                            byte b = packetBytes[i];
                            if(b == delimiter)
                            {
                                byte[] encodedBytes = new byte[readBufferPosition];
                                System.arraycopy(readBuffer, 0, encodedBytes, 0, encodedBytes.length);
                                final String data = new String(encodedBytes, "US-ASCII");
                                readBufferPosition = 0;

                                handler.post(new Runnable()
                                {
                                    public void run()
                                    {
                                        myLabel.setText(data);
                                    }
                                });
                            }
                            else
                            {
                                readBuffer[readBufferPosition++] = b;
                            }
                        }
                    }
                } 
                catch (IOException ex) 
                {
                    stopWorker = true;
                }
           }
        }
    });

    workerThread.start();
}

void sendData() throws IOException
{
    String msg = myTextbox.getText().toString();
    msg += "\n";
    mmOutputStream.write(msg.getBytes());
    myLabel.setText("Data Sent");
}

1 个答案:

答案 0 :(得分:0)

一定要知道线程是什么,或者我可以澄清一下。 您应该知道,您提供的代码是定义您的workerThread。一旦在该线程上调用start(),那么在run方法中编写的所有内容都将在另一个线程中运行。 run方法之前定义的所有变量都在主线程中定义。处理程序也是如此。

Handler旨在链接2个线程。您可以在一个线程(此处为run方法之前的主线程)中定义它,并在另一个线程(在run方法中)中使用它在线程中执行某些操作,并在其中定义它。在你的代码中,你打电话

handler.post(new Runnable()
                            {
                                public void run()
                                {
                                    myLabel.setText(data);
                                }
                            });
来自workerThread的

,所以

myLabel.setText(data);

将从主线程(实例化处理程序的线程)执行。

为什么这样做?因为.setText()不能从主线程调用另一个线程,因为它正在绘制一些东西。

while循环检查线程是否已被中断(由Android或其他东西)并且您的布尔值stopWorker尚未被修改,因此从inputStream读取时没有抛出异常< / p>

try {} catch(){}只是一种管理异常的方法。

.available()方法通过调用.read()方法为您提供可以从inpuStream中读取的字节数。如果有一些可用的字节(所以如果你从连接的设备接到电话的话,那么它就会读取它。

读取方法的工作原理如下:将一个字节数组作为参数传递,它将从输入流中获取可用的字节并将它们放入字节数组中。

然后它处理收到的字节......

但对我而言,它不是一个有效的解决方案,因为线程会非常快地循环,而.read()是一个阻塞方法,因此检查检查有一些字节可用的所有部分都是无用的,甚至效率低下。 .read()会使线程休眠直到新字节可用,从而释放资源。也许还有另一个原因,为什么代码这样做,但我没有看到它。

希望明白。