我需要从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请求的要求非常苛刻,但必须有解决方案。有什么想法吗?
答案 0 :(得分:1)
实际上没有任何解决方案,因为这不是一个真正的问题。 它只是垃圾收集器完成它的工作,除非1个进展产生数百个这样的,我不会太担心。
此外,这通常会在一瞬间停止执行您的逻辑。这就是GC的工作方式。它会“停止世界”一段时间。
你做错了,是在AsyncTask中做HTTP请求。 这不是AsyncTask的制作,或者至少不适合。它可以导致取消和/或丢失请求。
您希望在服务中运行此服务,一旦启动它的Activity消失,它就不会消失。
你可以看看RoboSpice,这是一个很好的图书馆来帮助你解决这个问题。
答案 1 :(得分:1)
使用具有固定线程池的执行程序控制生成线程的数量
Executor executor = new Executors.newFixedThreadPool(NUMBER_OF_THREADS);
然后在你的循环中
myAnotherAsyncTask.executeOnExecutor(executor,param0,param1)