Java Android Observable/AsyncTask在执行前等待循环结束
我正在从输入流(目前是一个文本文件,最终通过蓝牙)读取文本行 这些行被包装在一个bufferItem中,并添加到一个可观察的buffer(ArrayList)中&触发器Java Android Observable/AsyncTask在执行前等待循环结束,java,android,Java,Android,我正在从输入流(目前是一个文本文件,最终通过蓝牙)读取文本行 这些行被包装在一个bufferItem中,并添加到一个可观察的buffer(ArrayList)中&触发器 setChanged(); notifyObservers(item); 观察者上的更新方法为每个缓冲区项触发一个AsyncTask 因为我的输入流本质上是“无止境的”,所以我希望所有这些都同时发生(即数据正在处理,而新数据也实时到达),但我发现异步任务直到整个文件被读取后才开始 文件读取位如下所示: while (((inp
setChanged();
notifyObservers(item);
观察者上的更新方法为每个缓冲区项触发一个AsyncTask
因为我的输入流本质上是“无止境的”,所以我希望所有这些都同时发生(即数据正在处理,而新数据也实时到达),但我发现异步任务直到整个文件被读取后才开始
文件读取位如下所示:
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);
}
}
在将一个项添加到缓冲区的点上使用println,在异步任务中的一个下游进程中使用另一个println
所以我首先得到所有的“Item added to buffer”行,然后是下游的流程日志行,而我希望它们是分散的
所以问题是(我想)-为什么它要等到循环完成后再对notifyObservators()指令执行操作?看起来这与Honeycom(以及更高版本)如何处理AsyncTask有关-通过将AsyncTasks放在同一线程上,而与我最初认为的Observator模式无关 为了让它工作,我将文件读取代码移动到一个单独的AsyncTask,并这样调用它:
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
这允许处理文件数据的异步任务立即启动
如果是,则依次以“标准”方式调用
new Task(param1, param2).execute();
然后它们将按顺序运行
它们也可以这样称为:
new Task(param1, param2).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
在这种情况下,它们也将并行运行,但不会以读取文件的数据顺序运行。如果您需要使用与文件中的数据相同的顺序打包文件数据,这一点很重要
这篇文章是关键:
另外,Android文档-向下滚动到执行顺序
看来数据包/线路的顺序确实很重要,因此:
您需要对缓冲区队列设置一个上限,以便它们在满时阻塞,否则可能会耗尽RAM。还要确保流不会因为任何线程出错而被阻塞。为什么对此投反对票?
new Task(param1, param2).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);