0

バッファリーダーを使用して読み取られた要素をArrayListに追加するwhileループがあります。ループは正常に機能しますが、終了後、アプリが先に進まないようです。関連するコードは次のとおりです。

            int ctr = 1;
            while((test = bf.readLine()) != null)
            {

                Log.i(TAG, test);
                users.add(test);
                Log.i(TAG, "" + (ctr++));

            }
            Log.i(TAG, "Loop done.");

ループ内の2つのログステートメントはそれぞれ4回実行されますが、これは正常な動作です。ただし、ループ後のステートメントは実行されません。行き詰まったようなものです。内部の2つのログステートメントも実行されなくなるため、ループにも入らないと確信しています。

bfはBufferedReader、usersはArrayListです。

LogCat出力:

08-04 01:35:37.472: I/UM(2937):     UserInfo{0:Primary:3}
08-04 01:35:37.472: I/UM(2937): 1
08-04 01:35:37.476: I/UM(2937):     UserInfo{1:Test1:0}
08-04 01:35:37.476: I/UM(2937): 2
08-04 01:35:37.476: I/UM(2937):     UserInfo{2:test2:0}
08-04 01:35:37.480: I/UM(2937): 3
08-04 01:35:37.480: I/UM(2937):     UserInfo{3:testxyz:0}
08-04 01:35:37.480: I/UM(2937): 4

誰かが私の(おそらくばかげた)間違いが何であるかを知っていますか?

4

2 に答える 2

3

あなたのコードはその行でブロックされています:

 while((test = bf.readLine()) != null)

bfそして、データを提供するストリームが閉じられることは決してないため、そうしています。

(この回答は私のものではなく、コメントからの簡単な要約です。)

于 2012-08-03T20:29:39.517 に答える
2

私はそれが条件だと思います:

while((test = bf.readLine()) != null)

このように考えてください:

Console ("line1\nline2\n")
---->  BufferedReader ("line1\n", "line2\n")
---->  bf.readline() ("line1\n")
---->  bf.readline() ("line2\n")

あなたの条件は、コンソールが接続を完全に閉じるときをチェックしています。その時点で、BufferedReaderはに気づいて戻りnullます。

実際に起こっていることは、BufferedReaderへのコンソールの接続がまだ開いているということです。BufferedReaderは、別\nのコンソールから渡されるのを待ってから、 readLine()「line3\n」を返します。

于 2012-08-03T20:38:20.827 に答える