【问题标题】:Android: HTTP requests in AsyncTask are not concurrentAndroid:AsyncTask 中的 HTTP 请求不是并发的
【发布时间】:2012-10-31 00:57:27
【问题描述】:

我正在为my local cinematheque 编写一个粉丝应用程序,其中显示了接下来几天的放映日历。每天的电影列表是使用来自该站点的parametrized HTTP call 检索的(答案包含希伯来语,所以如果您单击链接并得到一些胡言乱语,这可能是可以的)。

应用程序显示接下来八天的日程安排,因此它会根据每天的日程安排请求拨打 8 个电话。

private class GetMoviesTask extends AsyncTask<Integer, Void, List<Film>>

doInBackground()每天检索电影列表,onPostExecute()更新界面。

MainActivity.onCreate()调用AsyncTask:

for (int i=0; i<NUMBER_OF_DAYS_TO_VIEW; i++){
    new GetMoviesTask().execute(i);
}

问题是 AsyncTask 不是并发执行的。日子一天又一天慢慢加载,慢得令人痛苦:

同时启动这些 AsyncCall 的最佳方式是什么?

【问题讨论】:

  • 为什么一定要并行?为什么不按顺序打呢?
  • @st0le 在这种情况下,我认为顺序 HTTP 调用是一种专业的尴尬。当我可以在~TIME_PER_CALL 中提供信息时,为什么还要让用户等待8*(TIME_PER_CALL)

标签: android concurrency android-asynctask


【解决方案1】:

AsyncTask 已知会在 Android 4.x 中遇到回归问题,系统一次执行一个,而不是像自 Android 1.6 以来那样同时执行它们。这是设计使然:基本上,在较新的平台上,您可以通过调用 executeOnExecutor() 而不是 execute() 来恢复到旧的并发行为。 Mark Murphy(在 StackOverflow 上称为 Commonsware)在他的博客上有 all the details sorted

【讨论】:

  • 正确。谢谢你的链接!
【解决方案2】:

基本上 AsyncTask 只会为你创建一个在后台运行的线程。

你可以通过两种方式实现你想要的。

  • 首先,您可以为每个操作创建单独的 AsyncTask。
  • 其次,通过在 doInBackground 方法中创建多个线程并发出并发请求和进程。之后,您可以通过将它们发布到 onProgressUpdate 或 onPostExecute 来通知您的 UI。

检查一下

android asynctask with threading

【讨论】:

    猜你喜欢
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多