gpt4 book ai didi

java - Android Observable/AsyncTask 等待循环结束后再执行

转载 作者:行者123 更新时间:2023-12-01 12:21:03 24 4
gpt4 key购买 nike

我正在从输入流(当前是文本文件,最终通过蓝牙)读取文本行

这些行被包装在 bufferItem 中并添加到可观察和触发器的缓冲区(ArrayList)中

setChanged();
notifyObservers(item);

观察者上的更新方法为每个缓冲区项目触发一个 AsyncTask。

因为我的输入流本质上是“无尽的”,所以我想要的是所有这些同时发生(即数据正在处理,同时新数据也实时到达),但我发现 asyncTasks 不在读取整个文件之前不会开始。

文件读取位如下:

while (((inputLine = bufferedReader.readLine()) != null)) {

if (inputLine.substring(0,1).equals("$")){
bufferItem bi = new bufferItem();
bi.addItem(inputLine);
for (int i = 1; i < repeatRate; i++) {
bi.addItem(bufferedReader.readLine());
}
// adding to buffer triggers the observer
buffer.addItem(bi);
}
}

整个 Observable/Observer 进程正在工作,但直到读取整个输入文件后,下游进程才会启动。

我正在使用类似于以下的行监视它:

System.out.println("Item added to buffer");

在将一个项目添加到缓冲区时使用 println,并将另一个项目添加到 asyncTask 内的下游进程之一中

因此,我首先获取所有“项目添加到缓冲区”行,然后是下游进程日志行,而我希望它们散布在一起。

所以问题是(我认为) - 为什么它要等到循环完成后再执行 notificationObservers() 指令?

最佳答案

看来数据包/线路的顺序很重要,所以:

  1. 接收器线程以 block 的形式读取输入,并将它们添加到输入缓冲区队列中。

  2. 处理器线程,用于 peek() 输入队列、处理项目并将它们放入输出缓冲区队列。如果输入队列为空,则该线程等待接收者将某些内容放入队列并通知它。

  3. 最后,调度程序线程将已处理的项目从输出缓冲区队列发送/写入/保存等。如果输出队列为空,则该线程等待处理器将某些内容放入队列并通知它。

您需要对缓冲区队列设置上限,以便它们在满时阻塞,否则您可能会耗尽 RAM。还要确保流程不会由于任何线程错误而被阻塞。

关于java - Android Observable/AsyncTask 等待循环结束后再执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26655377/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com