2015-08-20 4 views
1

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

Это, как я отправить сообщение от носимого (который, кажется, работает):

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

Debugger shows right values

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

+0

Вы пытались запустить этот код асинхронно в другом потоке ('AsyncTask')? –

+0

@KristianVukusic Спасибо за вашу помощь. Данная строка не очень длинная и с последующим тестированием я понял, что метод '' bufferedReader.readLine(); '' никогда не возвращает '' null''. Кроме того, '' метод inputStream.read() '' никогда не возвращает '' -1'' и не генерирует исключение. Это странное поведение, которое я не могу объяснить. – jfmg

ответ

1

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

+0

Вы правы! Я забыл закрыть '' OutputStream'', и поэтому я не получил '' null'' или '' -1'' в конце потока (потому что не было конца). Большое спасибо! Думаю, после 10 часов работы концентрация опускается слишком глубоко. Но в следующий раз что-то подобное произойдет, я найду решение гораздо быстрее :-) – jfmg