Android 无法理解蓝牙输入和输出
以下代码取自 有人能详细解释一下这是怎么回事吗 这个处理器是什么?它是做什么的 while条件是如何实现的 循环是如何进行的 我对代码的工作原理有着非常粗略的理解,如果你能帮我的话,我会受益匪浅。多谢各位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
{
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将使线程休眠,直到有新字节可用,从而释放资源。也许代码这么做还有另一个原因,但我看不出来
希望这是清楚的