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

Debugger показва правилните стойности

Опитвам се да изпратя „здравей от твоя смарт часовник“. Приложението обаче изглежда замръзва. Някой знае ли защо?


person jfmg    schedule 20.08.2015    source източник
comment
Опитвали ли сте да изпълнявате този код асинхронно в друга нишка (AsyncTask)?   -  person Kristian Vukusic    schedule 21.08.2015
comment
@KristianVukusic Благодаря за помощта. Даденият низ не е много дълъг и с по-нататъшно тестване разбрах, че методът bufferedReader.readLine(); никога не връща null. Освен това inputStream.read()method никога не връща -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