3

Android のソケットから入力ストリームを受け取るコードを以下に示します。それは正常に動作しますが、電話がスリープ状態になると、ロガーは受信したことを出力して狂ってしまい""ます。

私のデバッグから、ifループ全体のステートメントが十分でないことを意味しますか?

//Global variable declaration
private OnMessageReceived mMessageListener = null;
byte[] buffer = new byte[100];   

 while (mRun) {
            int len = in.read(buffer);
            input = "";

            if (buffer != null && mMessageListener != null) {
                for (int i = 0; i < len; i++) {
                    input += (char) buffer[i];
                }
                // call the method messageReceived from MyActivity class
                mMessageListener.messageReceived(input);
                System.out.println("Recieved: " + input);
            }
            input = "";
        }

それはで実行される私のコードですwhileif (buffer != null && mMessageListener != null) 今、私は自分の :コードで正しい条件をテストしていないと確信してい ます。

他に何をテストできますか / 何をテストできますか?

明らかに、while一度実行した後、バッファは == null ではなく、電話がスリープ状態になる (画面が黒くmMessageListenerなる) と非 null になると想定していますか?

ありがとう

4

3 に答える 3

0

1)複数の文字列を結合するために+演算子を使用しないでください。非常に低速です。代わりに、StringBuilderを使用してください。

    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < len; i++) {
       sb.append((char)buffer[i]);
    }

    String input = sb.toString();

または、単一の文字で参加する場合、これはさらに高速になる可能性があります。

    char[] inputChars = new char[len];

    for (int i = 0; i < len; i++) {
       inputChars[i] = (char)buffer[i];
    }

    String input = new String(inputChars);

この効果を達成するためのより短い方法があります。

    String input = new String(buffer);

2)わかりませんが、この場合、バッファがnullになることはないため、!=nullステートメントは無意味です。読み取られるデータがない場合、長さは0になる可能性があるため、len!=0かどうかを確認してください。

于 2013-03-08T07:30:08.527 に答える
0

編集まあ、そこには意地悪なステートメントがたくさんあります。それはすべてのコードですか?物事がどのようにしてnull自然に生命を生み出すと思いますか?

InputStream を使用したい場合、最も簡単な方法は を使用することScannerです:

String text = new Scanner(in).useDelimiter("\\A").next();

inこれは、「最後が見つかるまで入力ストリームをスキャンする」ことを示しています。別の区切り文字を使用して、複数の部分に分割できます。

于 2013-03-08T07:36:11.027 に答える
0

len変数が 0 より大きいことを確認する必要があります。ストリームの最後に到達すると、read メソッドは -1 を返します。

if (len>0 && buffer != null && mMessageListener != null)
于 2013-03-08T10:00:58.823 に答える