9

我有 2 个 AsyncTask,一个正在创建套接字连接,另一个正在使用这些套接字传输对象。我的代码是这样的:

try {
        connectat = true;
        transmitter = new SocketTransmitter();
        transmitter.execute();
        connector = new socketConnector();
        connector.execute(owner);

        this.open();
    } catch (IOException e) {

然而,被AsyncTask调用socketConnector者永远不会被创建或执行。我试图更改顺序,但未创建或执行发送器...

那有什么问题?

4

5 回答 5

12

I hated it when HONEY COMB changed the multiple AsyncTask execution from concurrent to sequential. So every time I execute an AsyncTask, I do something like this.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
    task.execute();
}

But the thread pool size is 5, if you add the sixth task, it will be added in a queue, and will not be executed until one of the 5 thread has finished.

于 2012-12-01T07:04:43.400 回答
2

由于我不知道您使用的是哪个 API 级别,我建议您通过ASYNC TASK

根据文档:

首次引入时,AsyncTask 在单个后台线程上串行执行。从 DONUT 开始,这被更改为允许多个任务并行运行的线程池。从 HONEYCOMB 开始,任务在单个线程上执行,以避免并行执行导致的常见应用程序错误。

如果你真的想要并行执行,你可以调用executeOnExecutor(java.util.concurrent.Executor, Object[]) with THREAD_POOL_EXECUTOR.

于 2012-11-30T15:33:13.230 回答
1

我已经编写了同时执行 AsyncTask 的类。

一探究竟:

Android-AsyncTask-Executor

在任何 Android 操作系统版本上同时运行 AsyncTask 需要所有工作,最好使用:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
    task.execute();
}

因为 AsyncTask.THREAD_POOL_EXECUTOR 仅在 api >= 11 上可用

在我的课上,你只需要写:

AsyncTaskExecutor.executeConcurrently(task, params);

仅此而已。Android 2.x、3.x 和 4.x上没有错误

于 2012-12-09T13:10:18.833 回答
1

您是否尝试过执行transmitterconnector's onPostExecute()反之亦然?

于 2012-11-30T15:15:24.300 回答
0

就像 Robin Chander 所说,它可能是串行运行的,您可以使用 executeOnExecutor ......但它直到 Android 3.0 才可用。如果你想要完全兼容,你需要转储AsyncTask和使用Runnable. 如果您需要在 UI 线程上报告结果,请不要忘记使用Handler.

于 2012-11-30T16:08:11.017 回答