第二个 AsyncTask 未执行

Posted

技术标签:

【中文标题】第二个 AsyncTask 未执行【英文标题】:Second AsyncTask not executing 【发布时间】:2012-11-18 19:55:40 【问题描述】:

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

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

        this.open();
     catch (IOException e) 

但是,从未创建或执行名为 socketConnectorAsyncTask。我尝试更改顺序,但未创建或执行发送器...

这有什么问题?

【问题讨论】:

【参考方案1】:

当 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

根据文档:

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

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

【讨论】:

【参考方案3】:

您是否尝试过在connector's onPostExecute() 中执行transmitter 或反之亦然?

【讨论】:

不可能,因为这两个 asyncTask 都有阻塞并且可能是无限的。【参考方案4】:

我写了一个类来同时执行 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

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于第二个 AsyncTask 未执行的主要内容,如果未能解决你的问题,请参考以下文章

AsyncTask 等待位置

从第二个活动返回时,在 AsyncTask 调用后保存 RecyclerView 状态

Android AsyncTask 等待其他函数完成

主要功能未执行我的第二个功能

使用 AsyncTask 解析 HTML 使主线程变慢

WebFlux 扩展未检索第二个请求