【问题标题】:Asynctask with network operation and another Asynctask task issue具有网络操作的 Asynctask 和另一个 Asynctask 任务问题
【发布时间】:2012-10-04 18:54:48
【问题描述】:

我遇到的问题是关于两个单独的 Asynctask 类。第一个 asynctask 在 doInBackground 方法中使用了网络操作

HttpResponse httpResponse = httpClient.execute(httpPost);

另一个是使用progressDialog加载图像的线程。

如果我使用慢速互联网连接(这意味着第一个 asynctask 尚未完成)然后直接转到第二个 asynctask 会发生什么,第二个类将等到第一个完成。

顺便说一句,在我调用第一个 asynctask 之后,我直接完成了活动并调用了另一个,这有什么关系吗?

tl;dr 版本:

在第一个 asynctask 完成之前,第二个 asynctask 不会执行 doinbackground 进程

我知道这一点是因为进度对话框显示了很长时间(我在 preExecute 中显示它并在 postexecute 中将其关闭)

编辑:

第一个异步任务涉及等待来自网络的响应。因此,虽然没有响应,但第二个 asynctask 不会执行其 doinbackground 进程。

编辑 2:

有没有办法让我正确使用这两个异步任务,这样第二个就不必等待第一个完成?

【问题讨论】:

  • 您的帖子不是很清楚,“直到第一个 asynctask 完成后,第二个 asynctask 才会执行 doinbackground 过程”不是问题。
  • developer.android.com/reference/android/os/AsyncTask.html。通过链接。您可能会找到问题的答案。
  • 我有 2 个独立的异步任务类。发生的事情是第二个 asynctask 不会执行其 doinbackground 方法,直到第一个 asynctask 是网络操作完成。我想我不太擅长计划事情
  • 进度对话框显示了很长时间。这意味着它确实调用了 onpreExecute 方法并在 doinBackground 方法处停止

标签: java android multithreading http android-asynctask


【解决方案1】:

我在我的应用程序中遇到了同样的问题 - 我需要在任何 Android 版本(从 2.1 到 4.2)中同时运行 4 个 AsyncTasks。但是在 Honeycomb 中,AsyncTasks 是串行运行的。

所以我写了 AsyncTaskExecutor - 它可以在任何 Android 版本上同时运行 AsyncTasks。

看看:

AsyncTaskExecutor

在任何 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 上可用;我正在使用自己的 threadPoolExecutor 实例

使用 AsyncTaskExecutor 你只需要写:

AsyncTaskExecutor.executeConcurrently(task, params);

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

附:很抱歉从其他问题中复制了我的答案,但我认为这会有所帮助

【讨论】:

    【解决方案2】:

    在第一个 AsyncTask onPostExecute(String result) 方法中启动第二个 AsyncTask,然后在完成第一个 AsyncTask 后启动第二个 AsyncTask。

    谢谢

    【讨论】:

    • 感谢您的回复。但第二个异步任务在不同的活动中
    • 第二个 AsyncTask 从不同的 android 活动类运行?
    • 如果可以实现,结果将是相同的:异步任务将串行运行。我认为这不是我们想要的行为。
    【解决方案3】:

    Google 更改了 Honeycomb (3.0) 中 AsyncTask 的行为。现在,一个进程的所有 AsyncTask 都是串行运行的 - 正如您所观察到的那样。

    正如您所描述的那样,这肯定是一个问题。我认为您需要将其中一个异步任务转换为其他内容,例如一个可运行的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-19
      相关资源
      最近更新 更多