Android在制作多个http请求时增加堆碎片情况

时间:2013-06-12 07:05:31

标签: java android android-asynctask heap-memory

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

  

I / dalvikvm-heap(25912):将堆(frag case)增长到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请求的要求非常苛刻,但必须有解决方案。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

实际上没有任何解决方案,因为这不是一个真正的问题。 它只是垃圾收集器完成它的工作,除非1个进展产生数百个这样的,我不会太担心。

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

你做错了,是在AsyncTask中做HTTP请求。 这不是AsyncTask的制作,或者至少不适合。它可以导致取消和/或丢失请求。

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

你可以看看RoboSpice,这是一个很好的图书馆来帮助你解决这个问题。

答案 1 :(得分:1)

使用具有固定线程池的执行程序控制生成线程的数量

Executor executor = new Executors.newFixedThreadPool(NUMBER_OF_THREADS);

然后在你的循环中

myAnotherAsyncTask.executeOnExecutor(executor,param0,param1)