Java Android中的异步任务、线程

Java Android中的异步任务、线程,java,android,multithreading,soap,android-asynctask,Java,Android,Multithreading,Soap,Android Asynctask,我有两个函数执行SOAP调用,另一个函数从两个SOAP调用生成一个列表。我正在考虑如何等待两个SOAP调用完成并运行第三个函数 Function A = SOAP (independent of B) Function B = SOAP (independent of A) Function C = Making a List from A & B (dependent on both A & B) Function D = displaying using List from

我有两个函数执行SOAP调用,另一个函数从两个SOAP调用生成一个列表。我正在考虑如何等待两个SOAP调用完成并运行第三个函数

Function A = SOAP (independent of B)
Function B = SOAP (independent of A)
Function C = Making a List from A & B (dependent on both A & B)
Function D = displaying using List from C
我当前的解决方案是将A放入asynctask中,将B放入A的onpostexecute中,将C放入B的onpostexecute中,这是不起作用的。我试着在每个函数的开头和结尾都放两个日志。它在A完成其“两个日志”之前就开始记录B的函数,这两个日志导致C混乱


我正在考虑将A和B放在单独的线程中,并在完成后连接它们。然后将C放入异步任务或另一个线程中。但我担心这会导致D(显示C中的列表)出现问题,因为使用我当前的异步任务解决方案时遇到了竞速问题。

嗯,这是一个逻辑顺序和并发性问题。试着这样做:

public void process() {
        Thread funcAThread = new Thread(new Runnable() {
            @Override
            public void run() {
                startFunctionA();
            }
        });

        Thread funcBThread = new Thread(new Runnable() {
            @Override
            public void run() {
                startFunctionB();
            }
        });

        try {
            funcAThread.start();
            funcBThread.start();
            funcAThread.join();
            funcBThread.join();
            startFunctionC();
            startFunctionD();
        } catch (InterruptedException e) {
            Log.getStackTraceString(e);
        }
    }
注意:确保所有对UI视图的调用(尤其是在函数D中)都是在UI线程内使用
活动进行处理的

注意2:如果functionC很耗时,你也可以从线程调用它,这样你的应用程序就能保持快速响应(这一点非常重要)。根据我上面的代码:

    try {
        funcAThread.start();
        funcBThread.start();
        funcAThread.join();
        funcBThread.join();
        new Thread(new Runnable() {
            @Override
            public void run() {
                startFunctionC();
                //once completed, call UI thread for D !
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        startFunctionD();
                    }
                });
            }
        }).start();
    } catch (InterruptedException e) {
        Log.getStackTraceString(e);
    }
注3:我不建议使用
AsyncTask
。不是因为它不好(当然不是),而是因为它们用于需要定义开头的操作,在后台处理的长操作,在UI线程上执行定期的更新,最后在主要长操作完成后执行一些其他操作。
您可以使用一个AsyncTask来执行所有操作,但是您将失去使用两个并发线程的优势,这两个线程可以利用多核CPU,从而更快地处理数据/执行操作。此外,我相信在某些Android版本上,一次只能使用一个异步任务。请检查此答案以了解更多信息:。因此,您最好使用线程:更清晰、更简单、同样快速。

通过各自的
异步任务同时运行
A
B

A
B
onPostExecute
函数中,调用记录任务已运行的函数

在这个回调函数中,您检查
A
B
是否都已完成,然后在另一个
AsyncTask
中运行
C

例如:

在每个异步任务中:

onPostExecute(Void result) {
    mCallback.onTaskCompleted(this.class);
}
在调用异步任务的类中:

onTaskCompleted(Class task) {
    if(task instanceof AsyncTaskA) mTaskA = true;
    else if(task instanceof AsyncTaskB) mTaskB = true;

    if(mTaskA && mTaskB) {
        runTaskC();
    }
}

无论如何,异步任务可以并行运行。使用
task.executeOnExecutor(AsyncTask.THREAD\u POOL\u EXECUTOR)。但是,这被锁定在更高的Android版本中。@Knossos这是完全正确的,这就是为什么我在Note3中包含了一个链接,其中提供了许多有关运行Parralel Asyntask的问题的详细信息;-)哎呀!错过了。我道歉!没问题。有趣的是,我遇到了这篇SO帖子,因为一年前我遇到了同样的问题,当时我正试图同时运行5个AsyncTask。我讨厌异步任务,我尽量不使用它们。根据可用内核的数量使用固定线程数的自定义托管线程池是一种方法,只要您现在知道该做什么;-)我的印象是Asyntask可以再次并行运行?如果是这样,那么可以运行多个异步任务,并且如果与倒计时锁存器一起使用,所有任务都可以同步?