Я пытаюсь подключиться к эмулятору терминала, используя библиотеку в 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);
Теперь я хочу, чтобы назначить потоки данных, отправлять и принимать его, но я думаю, что я делаю неправильно. В The 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)
или должны ли новые потоки автоматически отправляться на экран?
Моя теория заключается в том, что мой терминал подключен к старым потокам, и поэтому я не могу видеть данные на экране терминала. Правильно ли это?
Я попытался установить новые входные/выходные потоки в каждом методе только один раз, используя логическое значение и, если заявление, но затем я получаю предупреждение в LogCat
RuntimeException 'sending message to a Handler on a dead thread'
Я редактировал его писать и рад теперь на основе ответа, но я замечаю, что у библиотеки есть собственный метод записи для подачи данных на терминал, поэтому я даже не знаю, для чего предназначены потоки, если это тот случай, и мне нужна эта запись для записи к эмулятору?
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.
Вы хотите отправить каждую часть данных, другой поток или что? Если да, то это плохая идея, вы просто должны использовать bos.Read() и bis.Write() уже созданных потоков. – Mateusz
Я получаю то, что вы подразумеваете, спасибо, хотя это bos.write и т. Д., Вы смешивали их. :) Я попробовал это сейчас, и ничего не появляется на экране. Также, когда я вручную устанавливаю входной поток до 4096 байт в начале, это не проблема, не будет ли это заполняться? Или это имеет значение, так как это поток, и это начальное число вообще не имеет значения? – Paul