0

我需要从 Async Task 发出一堆 http 请求(大约 500 个)。为此,我正在使用 HttpClient。在大约 200 个请求之后,我在 LogCat 上得到了这个:

I/dalvikvm-heap(25912):将堆(碎片情况)增加到 9.321MB,分配 526096 字节 D/dalvikvm(25912):GC_CONCURRENT 释放 3K,1% 释放 9516K/9612K,暂停 3ms+1ms,总共 24ms

发生这种情况时,异步任务会暂停(代码停止执行)。我假设我使用了太多内存,所以我制作了那些静态类变量,所以它们只分配一次:

static HttpClient httpClient = new DefaultHttpClient();
static HttpContext localContext = new BasicHttpContext();
static HttpGet httpGet = new HttpGet();

使用后,其他所有内容都设置为 null。我也尝试在 Manifest "android:largeHeap="true"" 中设置大堆要求,但仍然出现同样的问题。

我无法弄清楚做错了什么。我知道对 500 个 http 请求的要求非常苛刻,但必须有解决方案。有任何想法吗?

4

2 回答 2

1

没有真正的解决方案,因为这不是一个真正的问题。它只是垃圾收集器在做它的工作,除非 1 个进度产生数百个这样的东西,否则我不会太担心。

此外,这会在瞬间停止执行您的逻辑是正常的。这就是 GC 的工作方式。它“停止了世界”一会儿。

但是,您做错的是在 AsyncTask 中执行 HTTP 请求。这不是 AsyncTask 的用途,或者至少不适合。它可能导致取消和/或丢失请求。

您希望它在服务中运行,一旦启动它的 Activity 死亡,它就不会消失。

你可以看看RoboSpice,这是一个很好的库来帮助你。

于 2013-06-12T07:11:45.243 回答
1

通过使用带有固定线程池的执行器来控制生成线程的数量

Executor executor = new Executors.newFixedThreadPool(NUMBER_OF_THREADS);

然后在你的循环中

myAnotherAsyncTask.executeOnExecutor(executor,param0,param1)
于 2013-06-12T07:57:14.763 回答