【问题标题】:Android: Retrofit: How to do lots of async requests correctlyAndroid:改造:如何正确处理大量异步请求
【发布时间】:2016-09-20 21:09:24
【问题描述】:

我在我的 Android 客户端中使用改造 2.x。在我的特殊情况下,我想异步上传>500个图片对象(实际上是文件)。

如果图片列表大小

   for (Picture pic : pictureList) {
        uploadPictureAsync(pic)

但是当大小超过 100 时,我的测试设备将中止并显示以下错误消息:

大对象分配失败:ashmem_create_region failed for 'large 对象空间分配':打开的文件太多

这似乎是由于异步请求过多造成的。

现在的问题是:如何处理如此庞大的请求?

【问题讨论】:

  • 你发现了吗?我目前正在做类似的事情。我想我必须在每个异步任务的回调方法上创建异步任务
  • 抱歉回复晚了。我认为问题在于我在多个 AsyncTask 实例中同时推送所有请求,这对设备来说太多了。所以我改变了它(同时用 IntentService 而不是 AsyncTask )上传一个文件 - 等待响应 - 当响应到达时,上传下一个文件。所以它不再是并行的,而是顺序的。

标签: java android http retrofit retrofit2


【解决方案1】:

首先,确保您有一个 Retrofit 服务实例,如果您使用它(而不是每次需要调用时都进行延迟实例化),要么您会得到“打开的文件太多”错误。

稍后,如果您需要上传这么多的图像,我建议您按照有关 ThreadPoolExecutors 的 Android 文档来管理使用 BlockingQueue 的异步调用。

https://developer.android.com/training/multiple-threads/create-threadpool.html

【讨论】: