以下代码取自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");
}
答案 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()会使线程休眠直到新字节可用,从而释放资源。也许还有另一个原因,为什么代码这样做,但我没有看到它。
希望明白。