Java Android grow heap frag案例,同时发出多个http请求
我需要从异步任务中发出大量http请求(大约500个)。为此,我正在使用HttpClient。在大约200次请求后,我在LogCat上得到了以下信息: I/dalvikvm堆(25912):对于 526096字节分配D/dalvikvm(25912):GC_并发释放3K,1% 免费9516K/9612K,暂停3ms+1ms,总计24ms 发生这种情况时,异步任务暂停(代码停止执行)。我假设我使用了太多的内存,所以我制作了这些静态类变量,以便只分配一次:Java Android grow heap frag案例,同时发出多个http请求,java,android,android-asynctask,heap-memory,Java,Android,Android Asynctask,Heap Memory,我需要从异步任务中发出大量http请求(大约500个)。为此,我正在使用HttpClient。在大约200次请求后,我在LogCat上得到了以下信息: I/dalvikvm堆(25912):对于 526096字节分配D/dalvikvm(25912):GC_并发释放3K,1% 免费9516K/9612K,暂停3ms+1ms,总计24ms 发生这种情况时,异步任务暂停(代码停止执行)。我假设我使用了太多的内存,所以我制作了这些静态类变量,以便只分配一次: static HttpClient htt
static HttpClient httpClient = new DefaultHttpClient();
static HttpContext localContext = new BasicHttpContext();
static HttpGet httpGet = new HttpGet();
使用后,其他所有内容都被设置为null。此外,我还尝试在清单“android:largeHeap=“true”中设置大堆要求,但仍然出现同样的问题
我不知道我做错了什么。我知道对500HTTP请求的要求非常苛刻,但必须有解决方案。有什么想法吗?实际上没有任何解决方案,因为这不是一个真正的问题。 这只是垃圾收集器在做它的工作,除非1 progress产生数百个垃圾收集器,否则我不会太担心 此外,这在瞬间停止执行逻辑也是正常的。GC就是这样工作的。它让世界停了一会儿 但您所做的错误是在AsyncTask中执行HTTP请求。 这不是AsyncTask所做的,或者至少不适合。它会导致请求被取消和/或丢失 您希望它在一个服务中运行,该服务不会在启动它的活动一结束就消失
您可以看一看,这是一个很好的库,可以帮助您解决这个问题。通过使用带有固定线程池的executor来控制生成线程的数量
Executor executor = new Executors.newFixedThreadPool(NUMBER_OF_THREADS);
然后在你的循环中
myAnotherAsyncTask.executeOnExecutor(executor,param0,param1)
我试图实现服务而不是AsyncTask,但存在问题,因为服务在主线程上运行。我也尝试过IntentService,但仍然存在相同的问题“主线程上的网络异常”。有什么想法吗?我只使用一个异步任务,http请求在异步任务中一个接一个地同步启动。你能给我一个简短的解释为什么你认为这是一个解决方案吗?我假设你正在尝试运行500个异步任务和请求。无论如何,每次调用httpClient.execute()时,它都会创建新的HttpResponse,在重新使用连接之前必须先使用它。看见我的方法是让AsyncTask一次发送一个连接,让executor注意不要运行太多并发任务。