Android InputStream - PullRequest
       7

Android InputStream

1 голос
/ 16 октября 2011

Я изучаю Android, но не могу пройти мимо InputStream.read (). Это всего лишь проверка сокета - сервер отправляет обратно два байта, когда получает соединение, и я знаю, что это работает нормально. Все, что я хочу сделать, это прочитать эти значения. B = data.read читает оба значения по очереди, но затем зависает, никогда не возвращает значение -1, как и ожидалось. Также это не исключение.

Есть идеи? Спасибо.

protected void startLongRunningOperation() {

    // Fire off a thread to do some work that we shouldn't do directly in the UI thread
    Thread t = new Thread() {
        public void run() {
            try {
                Log.d("Socket", "try connect ");
                Socket sock = new Socket("192.168.0.12", 5001);
                Log.d("socket", "connected");
                InputStream data = sock.getInputStream();

                int b = 0;
                while (b != -1) {
                    b = data.read();

                }


                data.close();
            } catch (Exception e) {
                Log.d("Socket", e.toString());
            }
        }
    };
    t.start();
}

1 Ответ

1 голос
/ 17 октября 2011

Достижение конца потока - это особое состояние. Это происходит не только потому, что читать нечего. Если поток все еще открыт, но читать нечего, он будет «зависать» (или блокироваться), как вы заметили , пока не встретится байт.

Чтобы сделать то, что вы хотите, серверу нужно либо закрыть / завершить поток, либо вам нужно использовать:

while (data.available() > 0) {
  ..

Когда количество доступных байтов равно нулю, в буфере потока нет ничего для чтения.

С другой стороны, если вы знаете, что для чтения должны быть только два байта, и это конец ваших данных, просто прочитайте два байта и продолжайте (т.е. не используйте цикл while ). Причина использования цикла while здесь может быть только в том случае, если вы не уверены, сколько всего байтов ожидать.

...