Мое приложение для Android зависает, когда я вызываю bufferedReader.readLine();

Я создал новый проект Android Studio для телефона Android и Android Wear, чтобы протестировать версию ChannelApi. Кажется, в моем проекте все работает нормально, за исключением того, что внутри метода onChannelOpened я не могу читать из InputStream без зависания приложения.

Вот как я отправляю сообщение с носимого устройства (похоже, оно работает):

Wearable.ChannelApi.openChannel(googleApiClient, node.getId(), channelIdentifier).setResultCallback(new ResultCallback<ChannelApi.OpenChannelResult>() {
    @Override
    public void onResult(ChannelApi.OpenChannelResult openChannelResult) {
        final Channel channel = openChannelResult.getChannel();
        channel.getOutputStream(googleApiClient).setResultCallback(new ResultCallback<Channel.GetOutputStreamResult>() {
        @Override
        public void onResult(final Channel.GetOutputStreamResult getOutputStreamResult) {
        final String message = "hello from your smartwatch";
        try {
            getOutputStreamResult.getOutputStream().write(message.getBytes());
            Log.d(TAG, "sendMessageToNode: onResult: onResult: Message sent: " + message);
        }
        // ...

Журнал печатает: D/MainActivity﹕ sendMessageToNode: onResult: onResult: Message sent: hello from your smartwatch

На стороне смартфона я пытаюсь прочитать сообщение следующим образом:

@Override
public void onChannelOpened(final Channel channel) {
    channel.getInputStream(googleApiClient).setResultCallback(new ResultCallback<Channel.GetInputStreamResult>() {
        @Override
        public void onResult(Channel.GetInputStreamResult getInputStreamResult) {
            Log.d(TAG, "onChannelOpened: onResult");

            String message = "";
            InputStream inputStream = null;
            BufferedReader bufferedReader = null;
            try {
                inputStream = getInputStreamResult.getInputStream();
                bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                String line = "";
                //while ((line = bufferedReader.readLine()) != null) {
                while (true) {
                    // Next line is freezing the app
                    line = bufferedReader.readLine();
                    Log.d(TAG, "onChannelOpened: onResult: line: " + line);
                    message += line + "\n";
                    if (line == null) break;
                }
                Log.d(TAG, "onChannelOpened: onResult: Received the following message: \" + message");
                // ...

Журнал печатает: D/MainActivity﹕ onChannelOpened: onResult но это все.

Я запустил отладчик и теперь знаю, что ошибка должна быть в этой строке: line = bufferedReader.readLine();. Но нет никаких исключений или чего-то еще. Отладчик даже показывает мне, что буфер имеет правильные значения:

Отладчик показывает правильные значения

Я пытаюсь отправить «привет от ваших умных часов». Однако приложение, похоже, зависает. Кто-нибудь знает, почему?


person jfmg    schedule 20.08.2015    source источник
comment
Вы пытались запустить этот код асинхронно в другом потоке (AsyncTask)?   -  person Kristian Vukusic    schedule 21.08.2015
comment
@KristianVukusic Спасибо за вашу помощь. Данная строка не очень длинная, и при дальнейшем тестировании я понял, что метод bufferedReader.readLine(); никогда не возвращает null. Кроме того, метод inputStream.read()никогда не возвращает -1 и не создает исключения. Это какое-то странное поведение, которое я не могу объяснить.   -  person jfmg    schedule 21.08.2015


Ответы (1)


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

person Ali Naddaf    schedule 21.08.2015
comment
Ты прав! Я забыл закрыть OutputStream и поэтому не получил null или -1 в конце потока (потому что конца не было). Большое спасибо! Думаю, после 10 часов работы концентрация падает слишком глубоко. Но в следующий раз, когда произойдет что-то подобное, я найду решение гораздо быстрее :-) - person jfmg; 22.08.2015