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

Android 无法理解蓝牙输入和输出,android,bluetooth,Android,Bluetooth,以下代码取自 有人能详细解释一下这是怎么回事吗 这个处理器是什么?它是做什么的 while条件是如何实现的 循环是如何进行的 我对代码的工作原理有着非常粗略的理解,如果你能帮我的话,我会受益匪浅。多谢各位 { final Handler handler = new Handler(); final byte delimiter = 10; //This is the ASCII code for a newline character stopWorker = fal

以下代码取自

有人能详细解释一下这是怎么回事吗

这个处理器是什么?它是做什么的

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

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

处理程序旨在链接两个线程。在run方法之前的一个线程(这里是主线程)中定义它,在run方法的另一个线程中使用它在定义它的线程中执行某些操作。所以在你的代码中,你调用

handler.post(new Runnable()
                            {
                                public void run()
                                {
                                    myLabel.setText(data);
                                }
                            });
从workerThread开始,所以

myLabel.setText(data);
将从主线程(实例化处理程序的线程)执行

它为什么这样做?因为.setText不能从主线程以外的其他线程调用,因为它正在绘制某些内容

while循环检查线程是否没有被Android或其他什么东西中断,布尔stopWorker是否没有被修改,以便在读取inputStream时没有引发异常

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

.available方法通过调用.read方法提供可以从inpuStream读取的字节数。如果有一些可用字节,那么如果您的手机从连接的设备接收到某些内容,它就会读取这些内容

读取方法是这样工作的:您将一个字节数组作为参数,它将从输入流中获取可用字节并将它们放入字节数组中

然后它处理接收到的字节

但对我来说,这不是一个有效的解决方案,因为线程的循环速度非常快,而.read是一种阻塞方法,因此所有检查是否有可用字节的部分都是无用的,甚至是低效的。read将使线程休眠,直到有新字节可用,从而释放资源。也许代码这么做还有另一个原因,但我看不出来

希望这是清楚的