第二个异步任务未执行。

9

我有两个AsyncTask,一个用于创建socket连接,另一个用于使用这些socket传输对象。我的代码如下:

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

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

然而,被称为socketConnectorAsyncTask从未被创建或执行。我尝试改变顺序,但发送器也没有被创建或执行...这是怎么回事?
5个回答

12

当HONEY COMB将多个AsyncTask的执行方式从并发更改为顺序时,我非常讨厌它。所以每次执行AsyncTask时,我会像这样做。

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

但线程池大小为5,如果添加第六个任务,它将被加入队列,并且直到其中一个5个线程完成后才会执行。


2

由于我不知道您使用的API级别,我建议您阅读异步任务(ASYNC TASK)文档。

根据文档:

在首次引入时,AsyncTasks是在单个后台线程上串行执行的。从DONUT版本开始,将其更改为一组线程池,允许多个任务并行操作。从HONEYCOMB版本开始,为避免并行执行引起的常见应用程序错误,任务在单个线程上执行。

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


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 上没有错误。


1
你尝试过在connectoronPostExecute()中执行transmitter吗?或者反过来呢?

不可能,因为两个asyncTask都有阻塞并且可能是无限的。 - Albert Pasaret

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接