Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android grow heap frag案例,同时发出多个http请求_Java_Android_Android Asynctask_Heap Memory - Fatal编程技术网

Java Android grow heap frag案例,同时发出多个http请求

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

我需要从异步任务中发出大量http请求(大约500个)。为此,我正在使用HttpClient。在大约200次请求后,我在LogCat上得到了以下信息:

I/dalvikvm堆(25912):对于 526096字节分配D/dalvikvm(25912):GC_并发释放3K,1% 免费9516K/9612K,暂停3ms+1ms,总计24ms

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

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注意不要运行太多并发任务。