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

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

Вот как я отправляю сообщение от Wearable (который, кажется, работает):

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();, Но здесь нет исключений или что-то еще. Отладчик даже показывает мне, что буфер имеет правильные значения:

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

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

1 ответ

Решение

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

Другие вопросы по тегам