7

これは簡単な答えがあるはずですが、私は何も見つかりませんでした。そして、私はまだアンドロイドダミーなので、人々に尋ねるためにここに来ました。

起動時に10個のAsyncTasksを実行するこのプロジェクトを作成しています。各タスクには3つのURLが含まれており、そこでデータを収集し、アプリでは(まだ)重要なことは何もしません。

また、AsyncTasksの進行状況を追跡するために使用する10個のテキストビューがあります。

タスクが開始すると、適切なテキストビューが「開始」に設定されます。タスクが進行中の場合、適切なテキストビューが「ダウンロード」に設定されます。タスクが終了すると、適切なテキストビューが「終了」に設定されます。

これは私が観察し、AsyncTaskについて質問するようになったものです。アプリを起動すると、5つのテキストビューが「ダウンロード中」マーカーに切り替えられていることに気付きます。そのため、5つのAsyncTasksが正常に機能していることがわかります。完了すると、新しいAsyncTaskが起動します。それでも、その制限である5を超えることはありません。

同時に実行される5つのAsynchTasksのこの制限の原因は何ですか?見つからないファイルでこれを引き起こしましたか?これはAndroid2.3.3の制限ですか?たぶん、私がアプリをシミュレートするために使用しているデバイスの制限ですか?

誰かが私のために詳しく説明できますか?

4

2 に答える 2

9

はい、制限があります。AsyncTaskはコアプールサイズが5のaに支えられていThreadPoolExecutorますが、最大プールサイズは128(1.6〜4.0.3)なので、実際には10個すべてが一度に実行されるのを確認する必要があります。ただし、変更することはできません。本当に別のことをしたい場合(そして、特別な理由がない限り、お勧めしません)、プールサイズを大きくしてカスタムを行うか、スレッドの束を手動でスピンアップする必要があります。

アップデート:

ドキュメントの内容は次のとおりです。

corePoolSizeを超え、maximumPoolSize未満のスレッドが実行されている場合、キューがいっぱいの場合にのみ新しいスレッドが作成されます。

だから。キューはいっぱいではないため、コアプールサイズのままになります。

于 2012-03-07T00:07:36.797 に答える
0

ThreadPoolExecutorには、corePoolSize、maxPoolSize、およびQueueCapacityがあります。corePoolSizeのすべてのスレッドが使用されている場合、他のタスクはコアプールの各スレッドのキューに入れられます。これらのキューがいっぱいになると、maxPoolSizeの制限内にある限り、新しいスレッドが初期化されます。

ここでの落とし穴は、各スレッドのキュー(プログラムで変更されない限り)がバインドされていないことです。つまり、コアプールサイズのすべてのスレッドが使用され、他のタスクはキューに入れられ、コアスレッドの1つで順番を待ちます。最大プールサイズに到達する機会はありません。

独自のエグゼキュータを設定し、キュー容量を変更する必要があります。幸運を!

于 2016-03-17T09:10:07.187 に答える