Этот вопрос может быть длинным, но я хочу предоставить много информации.
Обзор. Я создаю приложение Stock Quotes Ticker для Blackberry. Но у меня проблемы с моим StringBuffer, который содержит информацию об отдельных акциях.
Процесс: мое приложение подключается к нашему серверу через SocketConnection. Сервер отправляет отформатированный набор строк, содержащий последнюю сделку по акциям. Таким образом, всякий раз, когда происходит новая сделка, сервер будет отправлять отдельные котировки акций этой сделки. Через InputStream я могу прочитать эту информацию и поместить каждый символ в StringBuffer, на который ссылаются потоки. Анализируя на основе char3, я могу определить набор котировок/информации об акциях.
char1 - для разделения данных char3 - означает конец биржевой котировки/информации
пример формата котировок акций, отправленный нашим сервером: stock_quote_name(char 1)some_data(char1)some_data(char1)(char3)
Затем мое приложение анализирует эту котировку акций, чтобы сравнить определенные данные, и форматирует их так, как они будут выглядеть при отображении на экране. Когда сделки происходят постепенно (медленно), приложение работает отлично. Тем не мение..
Проблема: когда сделки происходят слишком быстро и почти одновременно, приложение "Мое" не может эффективно обрабатывать отправленную информацию. Содержимое StringBuffer объединяется со следующей сделкой. Значение Две биржевые данные в одном StringBuffer.
поле должно быть следующим: Stock_quote_name some_data some_data
пример происходящего: Stock_quote_name some_data some_dataStock_quote_name some_data some_data
вот мой код для этой части:
while (-1 != (data = is.read()))
{
sb.append((char)data);
while(3 != (data = is.read()))
{
sb.append((char)data);
}
UiApplication.getUiApplication().invokeLater(new Runnable()
{
public void run()
{
try
{
synchronized(UiApplication.getEventLock())
{
SetStringBuffer(sb);
DisplayStringBuffer();
RefreshStringBuffer();
}
} catch (Exception e)
{
System.out.println("Error in setting stringbuffer: " + e.toString());
}
}
});
}
public synchronized void DisplayStringBuffer()
{
try
{
//parse sb - string buffer
......
}
catch(Exception ex)
{
System.out.println("error in DisplayStringBuffer(): " + ex.toString());
}
}
public synchronized void SetStringBuffer(StringBuffer dataBuffer)
{
this.sb =dataBuffer;
System.out.println(sb);
}
public synchronized void RefreshStringBuffer()
{
this.sb.delete(0, this.sb.length());
}
Из того, что я вижу, когда сделки происходят очень быстро, StringBuffer не обновляется сразу и все еще содержит содержимое предыдущей сделки, когда я пытаюсь ввести новые данные.
Мой вопрос: есть ли у вас какие-либо предложения о том, как я могу поместить данные в StringBuffer без добавления следующей информации к первому содержимому?