我有2个AsyncTask,一个用于创建套接字连接,另一个用于使用这些套接字传输对象。我的代码是这样的:
try {
connectat = true;
transmitter = new SocketTransmitter();
transmitter.execute();
connector = new socketConnector();
connector.execute(owner);
this.open();
} catch (IOException e) {
但是,永远不会创建或执行名为AsyncTask
的{{1}}。我试图更改顺序但是然后没有创建或执行发射器......
那有什么不对吗?
答案 0 :(得分:11)
当HONEY COMB将多个AsyncTask执行从并发更改为顺序时,我讨厌它。 所以每次执行AsyncTask时,我都会这样做。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
task.execute();
}
但是线程池大小为5,如果添加第六个任务,它将被添加到队列中,并且在5个线程中的一个完成之前不会执行。
答案 1 :(得分:2)
由于我不知道您使用的是哪个API级别,我建议您通过ASYNC TASK
根据文件:
首次引入时,AsyncTasks在单个后台线程上串行执行。从DONUT开始,这被改为一个线程池,允许多个任务并行运行。从HONEYCOMB开始,任务在单个线程上执行,以避免由并行执行引起的常见应用程序错误。
如果您真的想要并行执行,可以调用
executeOnExecutor(java.util.concurrent.Executor, Object[]) with THREAD_POOL_EXECUTOR.
答案 2 :(得分:1)
您是否尝试在transmitter
connector's
中执行onPostExecute()
,反之亦然?
答案 3 :(得分:1)
我曾为同时执行AsyncTask写过类。
检查出来:
在任何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
答案 4 :(得分:0)
就像Robin Chander所说,它可能是串行运行的,你可以使用executeOnExecutor ......但是在Android 3.0之前它不可用。如果您想要完全兼容,则需要转储AsyncTask
并使用Runnable
。如果您需要在UI线程上报告结果,请不要忘记使用Handler
。