Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android Observable/AsyncTask在执行前等待循环结束_Java_Android - Fatal编程技术网

Java Android Observable/AsyncTask在执行前等待循环结束

Java Android Observable/AsyncTask在执行前等待循环结束,java,android,Java,Android,我正在从输入流(目前是一个文本文件,最终通过蓝牙)读取文本行 这些行被包装在一个bufferItem中,并添加到一个可观察的buffer(ArrayList)中&触发器 setChanged(); notifyObservers(item); 观察者上的更新方法为每个缓冲区项触发一个AsyncTask 因为我的输入流本质上是“无止境的”,所以我希望所有这些都同时发生(即数据正在处理,而新数据也实时到达),但我发现异步任务直到整个文件被读取后才开始 文件读取位如下所示: while (((inp

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

这些行被包装在一个bufferItem中,并添加到一个可观察的buffer(ArrayList)中&触发器

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文档-向下滚动到执行顺序


看来数据包/线路的顺序确实很重要,因此:

  • 一个接收器线程,用于读取块中的输入,将这些块添加到输入缓冲区队列

  • 处理器线程,用于查看输入队列、处理项目并将其放入输出缓冲区队列。若输入队列为空,则该线程将等待接收方在队列上放置某些内容并通知它

  • 最后,是一个调度程序线程,用于从输出缓冲区队列发送/写入/保存/etc已处理项。若输出队列为空,该线程将等待处理器将某些内容放入队列并通知它


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

    为什么对此投反对票?
    new Task(param1, param2).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);