2015-08-15 4 views
1

Мое приложение подключается к периферии Wi-Fi. Я использую Socket.getInputStream() и Socket.getOutputStream() для чтения/записи данных. Когда соединение установлено, я храню эти два потока, чтобы я мог их повторно использовать до тех пор, пока я подключен. Мое приложение отправляет команду через OutputStream каждую секунду и считывает результат из InputStream по методу read(). Через некоторое время я получаю «OutOfMemoryError». Исправьте меня, если я ошибаюсь, но я думаю, что это потому, что read() не удаляет прочитанные данные с InputStream, верно?Чтение из InputStream вызывает OutOfMemoryError

Мой вопрос: хорошо ли хранить потоки? Или я должен использовать Socket.getInputStream(), Socket.getOutputStream() каждый раз, когда я отправляю новую команду?

Это не проблема с OutputStream, так как я могу позвонить flush(). Что относительно reset() от InputStream? Удаляет ли это данные для потока?

Вот код, как я инкапсулировать мои Потоки:

@Override 
public InputStream getInputStream() throws IOException { 
    return _Socket.getInputStream(); 
} 

@Override 
public OutputStream getOutputStream() throws IOException { 
    return _Socket.getOutputStream(); 
} 

@Override 
public void connect() throws IOException { 
    try { 
     SocketAddress socketAddress = new InetSocketAddress(_ip, _port); 

     _Socket = new Socket(_ip, _port); 
    } catch (IOException e) { 
     MyExceptionHandler.appendLog(MyExceptionHandler.exceptionToString(e)); 

     throw e; 
    } 
} 

Код для передачи и приема команд происходит из этого API:

https://github.com/pires/obd-java-api/blob/master/src/main/java/com/github/pires/obd/commands/ObdCommand.java

Исключения делает также не сразу. Это происходит после ~ 30 минут и много команд отправлено/получено

+1

Необходимо обязательно указать код. – dotvav

+1

Потоки из обычного java.net.Socket определенно не хранят ни одну из данных. Ваша проблема в другом месте. – Joni

+2

Состояние вашего 'while' является изворотливым. Если вы достигнете конца потока перед встречей '\ n',' -1' возвращается неопределенно долго, и у вас есть бесконечный цикл. Если вы выделите память в теле цикла (возможно, в вашем «StringBuilder» добавив -1 снова и снова), у вас в конечном итоге закончится нехватка памяти. Это только предположение, потому что вы не показываете тело цикла. –

ответ

3

Исправьте меня, если я ошибаюсь, но я думаю, что это потому, что «read()» не удаляет прочитанные данные из InputStream, не так ли?

Неправильно. Если у вас заканчивается память, это происходит не из-за InputStream. У вас есть ошибка в коде.

Мой вопрос: хорошо ли хранить потоки?

Да.

Или следует использовать «Socket.getInputStream(), Socket.getOutputStream() каждый раз, когда я отправляю новую команду?

No.

насчет «сброса()» из InputStream? Удаляет данные для потока?

Нет, он делает то, что говорит в Джавадоке.

EDIT Код, с которым вы связались, сначала осмотрел груз мусора. Например, он никогда не проверяет конец потока, поэтому, когда это произойдет, он будет читаться вечно, накапливая 0xff байты и в конечном итоге заполняя память. Найти что-то лучше.

+0

Вы уверены, что я ошибаюсь? Не читает, просто перемещает курсор в поток? Здесь явно не объясняется: http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html#read() – stefan

+0

@stefan Всегда обращайтесь к официальным документам Android при работе с Android-проблемами , а не Oracle, могут быть тонкие различия (возможно, в этом случае нет, но все же) http://developer.android.com/reference/java/io/InputStream.html#read() –

+0

Я обновил мой вопрос. Я добавил ссылку на файл класса api, который я использую. Можете ли вы взглянуть на него? Возможно, вы обнаружите ошибку ... – stefan

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