2012-12-14 3 views
1

Я пытаюсь подключиться к эмулятору терминала, используя библиотеку в 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. 
+0

Вы хотите отправить каждую часть данных, другой поток или что? Если да, то это плохая идея, вы просто должны использовать bos.Read() и bis.Write() уже созданных потоков. – Mateusz

+0

Я получаю то, что вы подразумеваете, спасибо, хотя это bos.write и т. Д., Вы смешивали их. :) Я попробовал это сейчас, и ничего не появляется на экране. Также, когда я вручную устанавливаю входной поток до 4096 байт в начале, это не проблема, не будет ли это заполняться? Или это имеет значение, так как это поток, и это начальное число вообще не имеет значения? – Paul

ответ

1

Объекты в Java передаются по ссылке, поэтому, если вы

bos = new ByteArrayOutputStream(data.length) 

Вы существенно выбрасывая предыдущий OutputStream и создать новый.

Try ссылка хранение на свой входной и выходной поток и записывать данные в него, например:

bos.write(data); 
+0

Пробовал, что сейчас для бота писать и читать, все равно никаких изменений, но я думаю, что я больше готов к тому, чтобы быть сейчас, спасибо. Все еще раздражает, что ничего не появляется :(Когда я устанавливаю входной поток до 4096 байт в начале, будет ли этот bos.write (data) перезаписывать это фиксированное число? Или это вообще не так, поскольку это поток?А твой 4096 байт ничего не значит? – Paul

+0

@Mateusz Я отредактировал op, чтобы отметить, что библиотека имеет собственную запись для записи на вход терминала. Поэтому я очень смущен, что делать. Я либо передаю потоки в обычный способ записи потоков ввода/вывода, и ничего не появляется на терминале. Или я использую метод записи библиотеки, и я не знаю, как подключить bos/bis к ним. bos.session.write (данные); не работает или session.bos.write (data), это просто неправильный синтаксис? – Paul

Смежные вопросы