我正在尝试使用android中的库连接到终端仿真器,这将连接到串行设备,并且应该向我显示发送/接收的数据。要附加到终端会话,我需要为inputstream提供setTermIn(InputStream),为outputstream提供setTermOut(OutputStream)

我在onCreate()中初始化并附加了一些流,这些只是初始流,没有附加到我要发送/接收的数据上。

private OutputStream bos;
private InputStream bis;

...

byte[] a = new byte[4096];
bis = new ByteArrayInputStream(a);
bos = new ByteArrayOutputStream();
session.setTermIn(bis);
session.setTermOut(bos);
/* Attach the TermSession to the EmulatorView. */
mEmulatorView.attachSession(session);


我现在想在发送和接收数据时将流分配给数据,但是我认为我做错了。在每次按Enter键时都会调用的sendData()方法中,我有:

public void sendData(byte[] data)
{
        bos = new ByteArrayOutputStream(data.length);
}


onReceiveData()方法中,每次通过串行接收数据时都会调用:

public void onDataReceived(int id, byte[] data)
{
        bis = new ByteArrayInputStream(data);
}


我没有在终端屏幕上看到任何数据,但是我已成功通过串行发送和接收数据。所以我的问题是,我应该在每次发送和接收数据时都设置流,还是只设置一次。另外,我是否还需要将它们重新连接到终端会话mEmulatorView.attachSession(session)的某个地方,还是应该将新的流自动发送到屏幕?

我的理论是我的终端连接到旧的流,这就是为什么我无法在终端屏幕上看到数据的原因。这是正确的吗?

我尝试使用布尔值和if语句在每种方法中仅设置一次新的输入/输出流,但是随后我在logcat中收到警告消息

RuntimeException 'sending message to a Handler on a dead thread'

我已经根据答案将其编辑为write和rad,但是我注意到该库具有将数据馈送到终端的自己的write方法,因此即使那样,我什至不知道流是干什么的,并且我需要此写操作才能写入模拟器吗?

public void write(byte[] data,
              int offset,
              int count)
Write data to the terminal output. The written data will be consumed by the emulation     client as input.
write itself runs on the main thread. The default implementation writes the data into a     circular buffer and signals the writer thread to copy it from there to the OutputStream.

Subclasses may override this method to modify the output before writing it to the  stream, but implementations in derived classes should call through to this method to do the  actual writing.

Parameters:
data - An array of bytes to write to the terminal.
offset - The offset into the array at which the data starts.
count - The number of bytes to be written.

最佳答案

Java中的对象是通过引用传递的,因此如果您这样做

bos = new ByteArrayOutputStream(data.length)


您实际上是在丢弃先前的输出流并创建一个新的输出流。

尝试保持对输入和输出流的引用,并将数据写入其中,例如:

bos.write(data);

07-27 20:39