【问题标题】:My Android app is freezing when I call bufferedReader.readLine();当我调用 bufferedReader.readLine(); 时,我的 Android 应用程序冻结了
【发布时间】:2015-08-20 20:03:25
【问题描述】:

我为 Android 手机和 Android Wear 创建了一个新的 Android Studio 项目来测试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();。但是没有抛出异常或其他任何东西。调试器甚至显示缓冲区具有正确的值:

我正在尝试发送“来自您的智能手表的问候”。但是,该应用程序似乎冻结了。有谁知道为什么?

【问题讨论】:

  • 您是否尝试过在另一个线程 (AsyncTask) 中异步运行此代码?
  • @KristianVukusic 感谢您的帮助。给定的字符串不是很长,经过进一步测试,我发现bufferedReader.readLine(); 方法永远不会返回null。此外,inputStream.read()method 永远不会返回 -1 并且不会引发异常。这是我无法解释的一些奇怪行为。

标签: java android bufferedreader wear-os channel-api


【解决方案1】:

您需要关闭发送方的流,否则接收方将不知道是否会有更多数据通过通道传下。

【讨论】:

  • 你是对的!我忘了关闭OutputStream,因此我没有在流的末尾收到null-1(因为没有结束)。非常感谢!我猜在 10 个小时的工作之后,注意力会下降得太深。但是下次发生这种情况时,我会更快地找到解决方案:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-25
  • 2011-06-08
相关资源
最近更新 更多