Я создал новый проект 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();
. Но нет никаких исключений или чего-то еще. Отладчик даже показывает мне, что буфер имеет правильные значения:
Я пытаюсь отправить «привет от вашего SmartWatch». Однако приложение, похоже, замерзает. Кто-нибудь знает, почему?
Вы пытались запустить этот код асинхронно в другом потоке ('AsyncTask')? –
@KristianVukusic Спасибо за вашу помощь. Данная строка не очень длинная и с последующим тестированием я понял, что метод '' bufferedReader.readLine(); '' никогда не возвращает '' null''. Кроме того, '' метод inputStream.read() '' никогда не возвращает '' -1'' и не генерирует исключение. Это странное поведение, которое я не могу объяснить. – jfmg