0

我有一个 while 循环,它将使用缓冲读取器读取的元素添加到 ArrayList。循环工作正常,除非它完成后,应用程序似乎没有继续前进。相关代码为:

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

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

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

循环中的两条日志语句各执行 4 次,这是正常行为。但是,循环之后的语句不会执行。就像卡住了一样。我很确定它也不会进入循环,因为里面的两个日志语句也不再执行。

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")

您的条件是检查 Console 何时完全关闭其连接,此时 BufferedReader 将注意到并返回null

实际发生的是 Console 与 BufferedReader 的连接仍处于打开状态。BufferedReader 正在等待另一个\n从控制台传入,然后readLine()才会返回“line3\n”。

于 2012-08-03T20:38:20.827 回答