0

Async Task から大量の http リクエスト (約 500) を作成する必要があります。その目的のために、私は HttpClient を使用しています。約200回のリクエストの後、LogCatでこれを取得します:

I/dalvikvm-heap(25912): 526096 バイトの割り当て用にヒープ (frag ケース) を 9.321MB に拡張します 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 に設定されています。また、マニフェスト「android:largeHeap="true"」で大きなヒープ要件を設定しようとしましたが、それでも同じ問題が発生します。

何が間違っているのかわかりません。500 の http リクエストの要件が非常に厳しいことはわかっていますが、解決策が必要です。何か案は?

4

2 に答える 2

1

それは本当に問題ではないので、実際には解決策はありません。それは単にガベージ コレクターがその仕事をしているだけであり、1 回の進行で何百ものこれらが生成されない限り、あまり心配する必要はありません。

また、これによりロジックの実行が一瞬停止するのは正常です。それがGCの仕組みです。それは少しの間「世界を止める」。

あなたが間違っているのは、AsyncTask で HTTP リクエストを実行していることです。これは AsyncTask が作成したものではなく、少なくとも適していません。リクエストがキャンセルまたは失われる可能性があります。

これを開始したアクティビティが終了してもすぐに終了しないサービスで実行する必要があります。

これを支援する優れたライブラリである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 に答える