私はアンドロイドトレントアプリに取り組んでおり、同時に複数のトレントをダウンロードできる必要があります。私はそれをしている他のアプリケーションを見てきました。ttorrent Android アプリで同時に 10 以上の torrent をダウンロードできます。現在、非同期タスクを含むサービスを使用していますが、同時に 5 つ以上のタスクを実行することはできません (複数の AsyncTask を同時に実行することはできませんか? )。これをどのように行うことができるかについて何か考えはありますか?
2 に答える
すべての AsyncTask は、共有 (静的) ThreadPoolExecutor と LinkedBlockingQueue によって内部的に制御されます。AsyncTask で execute を呼び出すと、ThreadPoolExecutor は、後で準備ができたときにそれを実行します。
「準備はいつですか?」ThreadPoolExecutor の動作は、コア プール サイズと最大プール サイズの 2 つのパラメーターによって制御されます。現在アクティブなコア プール サイズ未満のスレッドがあり、新しいジョブが入った場合、executor は新しいスレッドを作成し、すぐに実行します。少なくともコア プール サイズのスレッドが実行されている場合、ジョブをキューに入れようとし、使用可能なアイドル スレッドができるまで (つまり、別のジョブが完了するまで) 待機します。ジョブをキューに入れることができない場合 (キューは最大容量を持つことができます)、ジョブを実行するための新しいスレッド (最大プール サイズのスレッドまで) を作成します。キープアライブ タイムアウト パラメータ。
Android 1.6 より前では、コア プール サイズは 1 で、最大プール サイズは 10 でした。Android 1.6 以降、コア ポア サイズは 5 で、最大プール サイズは 128 です。キューのサイズはどちらも 10 です。キープアライブのタイムアウトは、2.3 より前は 10 秒、それ以降は 1 秒でした。
これらすべてを念頭に置いて、AsyncTask がタスクの 5/6 しか実行していないように見える理由が明らかになりました。6 番目のタスクは、他のタスクの 1 つが完了するまでキューに入れられます。これは、実行時間の長い操作に AsyncTasks を使用すべきでない非常に適切な理由です。これにより、他の AsyncTasks が実行されなくなります。
完全を期すために、6 つを超えるタスク (たとえば 30) で演習を繰り返した場合、キューがいっぱいになり、executor がプッシュされてより多くのワーカー スレッドを作成するため、6 つを超えるタスクが doInBackground に入ることがわかります。長時間実行されるタスクを維持すると、20/30 がアクティブになり、10 がまだキューにあることがわかります。
Android Download Manager を使用してみませんか。ダウンロードの管理方法はわかりませんが、同時に多くのファイルをダウンロードしているようです。