第二个 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)
但是,从未创建或执行名为 socketConnector
的 AsyncTask
。我尝试更改顺序,但未创建或执行发送器...
这有什么问题?
【问题讨论】:
【参考方案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 未执行的主要内容,如果未能解决你的问题,请参考以下文章